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

时间:2017-02-26 01:33:40

标签: 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 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结构。

3 个答案:

答案 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(并设置地图使用字符串而不是*字符串)。