go - 范围解包中的有效短变量声明

标签 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

请注意,同样适用于数组和 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/

相关文章:

golang otto 加载JS报错

html - 将选择的数据返回到包含键值对的下拉表单元素

go - for循环初始化器中的结构

linux - 无法使用 pulseaudio 作为 systemd 单元捕获麦克风输入

regex - golang 如何使用正则表达式将字符串拆分为包含分隔符的 slice

go - Go中的switch和select有什么区别?

go - 如何快速连续发送两条消息,一次全部收到

file - 如何执行文件系统扫描

golang 模块无法将单个依赖项更新到我的 .mod 文件

amazon-web-services - 无法使用 Golang 生成亚马逊产品 API 签名