这段代码为什么运行 包主
import "fmt"
func main() {
myMap := map[string]int{
"a": 1,
"b": 1,
}
for k, v := range myMap {
fmt.Println(k, v)
}
}
但是这段代码
package main
func main() {
x := test()
}
func test() (int, int) {
return 0, 1
}
不会编译:
福 ~/c/p/gobook (f14d0e9)|master⚡
± : go build test.go
# command-line-arguments
./test.go:4: multiple-value test() in single-value context
请注意,同样适用于数组和 slice :
package main
import "fmt"
func main() {
myArray := [...]int{1, 2, 3}
mySlice := myArray[:]
for i := range mySlice {
fmt.Println(i)
}
for i, x := range mySlice {
fmt.Println(i, x)
}
for i := range myArray {
fmt.Println(i)
}
for i, x := range myArray {
fmt.Println(i, x)
}
}
编译器做了什么允许消费者选择在 map
范围内解包一个或两个返回值?为什么语言设计者允许将此用于映射、 slice 和数组,但不允许用于函数的返回值?
最佳答案
您的程序期望您接受从函数 test
返回的两个值。事实上,你只会得到一个。要使此代码正常工作,您只需进行一点小改动。
package main
func main() {
x,_ := test()
}
func test() (int, int) {
return 0, 1
}
在范围的情况下,显然它有多个接口(interface)。另请注意,它不是函数,而是保留字。函数不可能有可选的返回参数——Go 不支持函数重载。不幸的是,这受到语言的限制(从我的角度来看,你不会造成混淆是一件好事,你总是只有一个方法,只有一个特定的名称,总是只匹配一个接口(interface))。
关于go - 范围解包中的有效短变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44751147/