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 包的扫描函数都需要传递变量的指针来存储输入值。

回到顶部