2017-02-26 2 views
0

Warum ist das so? Hier ist mein Code:Zwei Zeichenfolgen haben die gleiche Zeigeradresse

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) 
} 

Er druckt

Username 
Password 
[0xc4201ca2c0 0xc4201ca2c0] 
$2a$10$F6hR0scvtbFDx0l1GR.OX.ZweozUzwKVTG3H8GBQxpYCEdFifDrzy 
$2a$10$F6hR0scvtbFDx0l1GR.OX.ZweozUzwKVTG3H8GBQxpYCEdFifDrzy 

Wie Sie sehen können, keys die gleiche Adresse auf zwei verschiedene Strings enthält. Infolgedessen sind ihre Werte gleich.

Mein Ziel ist es, username und password zu UserLogin struct.

Antwort

2

Ändern Sie keys[i] = &val zu keys[i] = &userLoginKeys[i], so können Sie verschiedene Adressen erhalten.

0

Sie weisen in Ihrer Schleife keys[i] = &val zu, das jedem Array-Element dieselbe Adresse zuweist. Dies bedeutet auch, dass Sie nur den letzten Wert erhalten. Was Sie wahrscheinlich wollen, ist keys[i] = val (und setzen Sie die Karte, um Zeichenfolgen anstelle von * Zeichenfolgen zu verwenden).

+0

So einfach das ist, wie es funktioniert und es gibt keine Abhilfe? 'val' funktioniert nur nicht mit' Scan() ', es benötigt' Zeiger'. – adredx

+0

Ich denke, Sie müssen das Schlüssel-Array nicht initialisieren. Pass einfach so auf, wie es ist, nachdem du sie deklariert hast. – sdkie

1
for i, val := range userLoginKeys { 
    keys[i] = &val 
    fmt.Println(val) 
} 

Hier ist val eine unabhängige Variable, deren Adresse Sie den Schlüsseln [i] zuweisen. Also beide Male bekommst du die gleiche Adresse.

Try this:

for i:=0; i<len(userLoginKeys); i++ { 
    keys[i] = &userLoginKeys[i] 
    fmt.Println(keys[i]) 
} 
Verwandte Themen