解压范围

时间:2017-06-25 22:22:26

标签: go

为什么这段代码会运行     包主要

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范围内的一个或两个返回值?为什么语言设计者允许这样做地图,切片和数组,而不是函数的返回值?

1 个答案:

答案 0 :(得分:2)

您的程序希望您接受从函数test返回的两个值。事实上,你只得到一个。要使此代码有效,您只需进行一次小的更改。

package main

func main() {
    x,_ := test()
}

func test() (int, int) {
    return 0, 1
}

如果范围显然它有多个接口。还请注意它不是一个功能而是保留字。您的函数不可能有可选的返回参数 - Go不支持函数重载。不幸的是,这受到语言的限制(从我的角度来看,你不会产生混淆是一件好事,你总是只有一个方法,只有一个特定的名称总是只匹配一个接口)。