片段:
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/