Golang 将指针传递给 sql .Scan() 返回指针

对为什么会发生以下情况感到困惑。TLDR;我将指针和“&val”传递给 database/sql 的Scan方法,并得到不同的结果


rows, err := db.Query(selectRowsQuery)

val = new(int)


for rows.Next() {

  err = rows.Scan(val)

...

fmt.Println(val)      // 0xc0000b6c48

Val 的值是一个指针。为什么 val 保留为指针?


但如果我这样做:


var val int

...

err = rows.Scan(&val)

fmt.Println(val)          // 0

val 作为值返回。“&val”(val 是一个 int 值)和“val” (val 是一个指向 int 的指针)不是一回事吗?


慕码人2483693
浏览 302回答 1
1回答

回首忆惘然

在第一种情况下,当您执行此操作时,val = new(int)您将获得一个指针,rows.Scan(val)并将一个值放入指针正确指向的位置,但您正在打印fmt.Println(val): 这只是意味着您希望 Go 打印指针。它做了什么......指针的字符串表示是它指向的地址。你想要做的是fmt.Println(*val),它说'打印指针指向的值'。第二个示例正常工作,因为var val int初始化了一个值,并fmt.Println(val)正确打印它。要求您通过调用err = rows.Scan(&val)发送地址,因为这就是我们告诉将数据放在哪里而不是传递它不能做任何事情的数据的方式。val&valrows.Scan
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go