【问题标题】:Two strings the have same pointer address两个具有相同指针地址的字符串
【发布时间】:2017-02-26 01:33:40
【问题描述】:

为什么会这样?这是我的代码:

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 结构。

【问题讨论】:

    标签: go interface


    【解决方案1】:

    keys[i] = &val改成keys[i] = &userLoginKeys[i],这样就可以得到不同的地址了。

    【讨论】:

      【解决方案2】:
      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])
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 所以这就是它的工作原理并且没有解决方法? val 仅不适用于Scan(),它需要pointers
        • 我猜你不需要初始化 keys 数组。在你声明它们之后直接传递它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多