Golang将指针传递给sql.Scan()返回指针
困惑于为什么会发生下面的事情。 太长,读不下去了我将一个指针和一个“&val”传递给database/sql的Scan方法,并得到不同的结果Golang将指针传递给sql.Scan()返回指针,go,pointers,Go,Pointers,困惑于为什么会发生下面的事情。 太长,读不下去了我将一个指针和一个“&val”传递给database/sql的Scan方法,并得到不同的结果 rows, err := db.Query(selectRowsQuery) val = new(int) for rows.Next() { err = rows.Scan(val) ... fmt.Println(val) // 0xc0000b6c48 Val的值是指针。为什么瓦尔一直是一个指针 但如果我这样做: var val i
rows, err := db.Query(selectRowsQuery)
val = new(int)
for rows.Next() {
err = rows.Scan(val)
...
fmt.Println(val) // 0xc0000b6c48
Val的值是指针。为什么瓦尔一直是一个指针
但如果我这样做:
var val int
...
err = rows.Scan(&val)
fmt.Println(val) // 0
val作为值返回。“&val”(val是一个int值)和“val”(val是指向int的指针)不是一回事吗?在第一种情况下,当您执行
val=new(int)
时,您会得到一个指针,并且行。Scan(val)
会将一个值放入指针正确指向的位置,但是您正在打印fmt.Println(val)
:这意味着您想要打印指针。确实如此。。。指针的字符串表示是指针指向的地址。您要做的是fmt.Println(*val)
,上面写着“打印指针指向的值”
第二个示例工作正常,因为
var val int
初始化一个值,并且fmt.Println(val)
正确打印它err=rows.Scan(&val)
要求您通过调用&val
发送val
的地址,因为这就是我们告诉行的方式。Scan
将数据放在何处,而不是传递它无法处理的数据。要打印整数而不是第一段代码中的指针,取消对指针的引用:fmt.Println(*val)
请浏览Go for language fundamentals或查阅任何C参考资料,了解什么是指针及其行为。谢谢!!非常清楚的解释,现在有意义:)