Golang新手关于scan的完整问题指南
Golang新手关于scan的完整问题指南 你好
这是 fmt 包的 Scan 函数定义:
func Scan(a …interface{}) (n int, err error)
仅从上面的函数定义来看(没有文档),我如何确定应该使用 a 还是 &a?
使用:
var name string
fmt.Scan(&name) 还是 fmt.Scan(name)
谢谢
2 回复
你好 @AttilaK 。答案是,为了在外部获取读取的值(在 Scan 函数内部),你必须传递一个指针
。直接传递一个标识符而不是它的指针,会导致标准输入的值被丢弃。
更多关于Golang新手关于scan的完整问题指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 中,fmt.Scan 需要接收指针参数来修改调用者的变量值。从函数签名 func Scan(a …interface{}) (n int, err error) 中的 interface{} 类型来看,你需要传递变量的地址。
正确示例:
var name string
fmt.Scan(&name) // 正确:传递指针
错误示例:
var name string
fmt.Scan(name) // 错误:无法修改 name 的值
原理说明:
Scan函数通过接收interface{}类型参数,在内部使用反射检测传入的是否为指针- 只有传递指针(如
&name)才能让函数修改原始变量的值 - 如果传递值类型,函数会创建副本,修改不会反映到原变量上
完整示例:
package main
import "fmt"
func main() {
var name string
var age int
fmt.Print("输入姓名和年龄: ")
n, err := fmt.Scan(&name, &age)
if err != nil {
fmt.Println("输入错误:", err)
return
}
fmt.Printf("成功读取 %d 个值: %s, %d\n", n, name, age)
}
其他相关函数:
// Scanln 同样需要指针
fmt.Scanln(&name)
// Scanf 也需要指针
fmt.Scanf("%s %d", &name, &age)
记住:所有 fmt 包的扫描函数都需要传递变量的指针来存储输入值。

