2017-02-26 110 views
0

这是为什么呢?这里是我的代码:两个字符串具有相同的指针地址

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包含相同的地址到两个不同的字符串。因此,它们的值是相同的。

我的目标是将usernamepassword映射到UserLogin结构。

回答

2

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

0

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

+0

所以这只是它是如何工作的,有没有解决办法? 'val'只对'Scan()'不起作用,它需要'指针'。 – adredx

+0

我想你不需要初始化数组。只要在声明它们之后按原样传递它即可。 – sdkie

1
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]) 
} 
相关问题