为什么这段代码会运行 包主要
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
请注意,数组和切片也是如此:
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
范围内的一个或两个返回值?为什么语言设计者允许这样做地图,切片和数组,而不是函数的返回值?
答案 0 :(得分:2)
您的程序希望您接受从函数test
返回的两个值。事实上,你只得到一个。要使此代码有效,您只需进行一次小的更改。
package main
func main() {
x,_ := test()
}
func test() (int, int) {
return 0, 1
}
如果范围显然它有多个接口。还请注意它不是一个功能而是保留字。您的函数不可能有可选的返回参数 - Go不支持函数重载。不幸的是,这受到语言的限制(从我的角度来看,你不会产生混淆是一件好事,你总是只有一个方法,只有一个特定的名称总是只匹配一个接口)。