为什么会这样?这是我的代码:
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
如您所见,keys
包含两个不同字符串的相同地址。结果,它们的值是相同的。
我的目标是将username
和password
映射到UserLogin
结构。
答案 0 :(得分:2)
将keys[i] = &val
更改为keys[i] = &userLoginKeys[i]
,这样您就可以获得不同的地址。
答案 1 :(得分:1)
for i, val := range userLoginKeys {
keys[i] = &val
fmt.Println(val)
}
这里,val是一个独立变量,其地址分配给keys [i]。所以两次你得到相同的地址。
试试这个:
for i:=0; i<len(userLoginKeys); i++ {
keys[i] = &userLoginKeys[i]
fmt.Println(keys[i])
}
答案 2 :(得分:0)
您在循环中分配keys[i] = &val
,这是为每个数组元素分配相同的地址。这也意味着您只获得最后一个值。你可能想要的是keys[i] = val
(并设置地图使用字符串而不是*字符串)。