2017-02-26 6 views
0

これはなぜですか?ここに私のコードだ:2つの文字列は同じポインタアドレスを持っています

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は、二つの異なる文字列に同じアドレスが含まれています。その結果、それらの値は同じになります。

私の目標はusernamepasswordUserLogin構造体にマップすることです。

答えて

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]) 
} 
関連する問題