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数组。你申报后就照原样传递吧。