2017-02-26 114 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]) 
} 
相關問題