Go 两个字符串具有相同的指针地址

Go 两个字符串具有相同的指针地址,go,interface,Go,Interface,为什么会这样?这是我的密码: import ( "database/sql" "fmt" "reflect" "github.com/fatih/structs" ) type UserLogin struct { Username string Password string } func Login() { row := sql.QueryRow("SELECT username, password FROM us

为什么会这样?这是我的密码:

import (
    "database/sql"
    "fmt"
    "reflect"        

    "github.com/fatih/structs"
)

type UserLogin struct {
    Username string
    Password string
}

func Login() {
    row := sql.QueryRow("SELECT username, password FROM users WHERE username=?", "golang")

    userLoginKeys := structs.Names(UserLogin{})
    keys := make([]interface{}, len(userLoginKeys), len(userLoginKeys))
    for i, val := range userLoginKeys {
        keys[i] = &val
        fmt.Println(val)
    }

    fmt.Println(keys)

    _ := row.Scan(keys...)
    v1 := reflect.ValueOf(keys[0]).Elem().String()
    v2 := reflect.ValueOf(keys[1]).Elem().String()
    fmt.Println(v1)
    fmt.Println(v2)
}
它打印

Username
Password
[0xc4201ca2c0 0xc4201ca2c0] 
$2a$10$F6hR0scvtbFDx0l1GR.OX.ZweozUzwKVTG3H8GBQxpYCEdFifDrzy
$2a$10$F6hR0scvtbFDx0l1GR.OX.ZweozUzwKVTG3H8GBQxpYCEdFifDrzy
如您所见,
包含两个不同字符串的相同地址。因此,它们的值是相同的


我的目标是将
username
password
映射到
UserLogin
struct

在循环中分配
键[i]=&val
,这是给每个数组元素分配相同的地址。这也意味着您只获取最后一个值。您可能需要的是
keys[i]=val
(并将映射设置为使用字符串而不是*字符串)。

您在循环中分配
keys[i]=&val
,这是为每个数组元素分配相同的地址。这也意味着您只获取最后一个值。您可能需要的是
keys[i]=val
(并将映射设置为使用字符串而不是*字符串)。

keys[i]=&val
更改为
keys[i]=&userLoginKeys[i]
,这样您就可以获得不同的地址。

keys[i]=&val
更改为
keys[i]=&userLoginKeys[i]
,所以你可以得到不同的地址

for i, val := range userLoginKeys {
    keys[i] = &val
    fmt.Println(val)
}
这里,val是一个自变量,您将其地址分配给键[i]。所以这两次你都得到了相同的地址

试试这个:

for i:=0; i<len(userLoginKeys); i++ {
    keys[i] = &userLoginKeys[i]
    fmt.Println(keys[i])
}
i:=0的
;我
这里,val是一个自变量,您将其地址分配给键[i]。所以这两次你都得到了相同的地址

试试这个:

for i:=0; i<len(userLoginKeys); i++ {
    keys[i] = &userLoginKeys[i]
    fmt.Println(keys[i])
}

i:=0的
;iSo这就是它的工作原理,没有解决办法
val
仅不适用于
Scan()
,它需要
指针
。我想您不需要初始化keys数组。声明后按原样传递就行了。这就是它的工作原理,没有解决方法
val
仅不适用于
Scan()
,它需要
指针
。我想您不需要初始化keys数组。你申报后就照原样传递吧。