go - 将 slice 传递给 Scanf

标签 go slice

片段:

package main
import "fmt"

func main() {
    mapIsh := make([]int64, 5)
    fmt.Scanf("%v %v %v %v %v", &mapIsh[0], &mapIsh[1], &mapIsh[2], &mapIsh[3], &mapIsh[4])

    fmt.Print(mapIsh[0], mapIsh[1], mapIsh[2], mapIsh[3], mapIsh[4])
}

我创建了一个 slice 并想保存读取操作的内容。以上工作按预期进行。我不明白的是为什么我必须将指针传递给数组元素(我假设这些值是通过 slice/数组的引用传递的)。

此外,如果我不将其中一个参数设为指针,则不会读取后续值。那么有人可以解释以下内容吗:

输入数据:1 2 3 4 5

1) 对于:

fmt.Scanf("%v %v %v %v %v", mapIsh[0], mapIsh[1], mapIsh[2], mapIsh[3], mapIsh[4])

我得到:0 0 0 0 0

2) 对于:

    fmt.Scanf("%v %v %v %v %v", &mapIsh[0], &mapIsh[1], mapIsh[2], &mapIsh[3], &mapIsh[4])

我得到:1 2 0 0 0

最佳答案

在 Go 中,参数始终按值传递,从不按引用传递。

你是对的,将 slice 传递给函数将允许函数改变其元素。但是您没有将 slice 传递给 Scanf;您的两个示例传入的是 int64 元素,而不是传入这些元素的地址。我认为您对索引语法感到困惑,并且认为 mapIsh[0] 不知何故意味着您正在传递函数将能够改变的东西。但是 mapIsh[0] 实际上只是一个 int64,mapIsh 的第一个元素。

至于为什么你会得到零,那是因为 Go 将 mapIsh 初始化为零值,对于 int64 数组来说是全 0。当 Scanf 无法读入您忘记了 & 的值时,它无法继续。这就是为什么您应该检查从 Scanf 返回的错误,这将指示错误。

(请注意,按值传递意味着将数组传递给函数会创建该数组的副本,因此该函数将无法像对 slice 那样改变元素。这实际上并不相关在这里,如上所述。)

关于go - 将 slice 传递给 Scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164649/

相关文章:

json - 从 golang 中的 map 生成字典 map

go - Golang将slice append 到slice的slice上,那么slice会一直影响slice的slice吗?

go - 将 Goland 更新到 EAP 19 后没有可构建的 go 源文件

go - 使用 make 为不同的体系结构构建动态目标?

go - 用 cgo 在 C 中制作一个 go 字符串

javascript - Jquery,切片失败时返回什么?

algorithm - 构建切片树的算法是什么?

performance - 结构 slice 与指向结构的指针 slice

go - Go接口(interface)中如何处理重复的方法?

sqlite - mattn/go-sqlite 3's regexp extension faster than sqlite3' s LIKE 运算符是否用于 '%word%' 搜索?