25

在 Go 中,以下工作(注意地图的一种使用有一个返回,另一种有两个返回)

package main

import "fmt"

var someMap = map[string]string { "some key": "hello" }

func main() {
    if value, ok := someMap["some key"]; ok {
        fmt.Println(value)
    }

    value := someMap["some key"]
    fmt.Println(value)
}

但是,我不知道如何用我自己的函数做同样的事情。是否有可能具有类似的行为与可选的返回,如map

例如:

package main

import "fmt"

func Hello() (string, bool) {
    return "hello", true
}

func main() {
    if value, ok := Hello(); ok {
        fmt.Println(value)
    }

    value := Hello()
    fmt.Println(value)
}

无法编译(由于错误multiple-value Hello() in single-value context)......有没有办法让这个语法适用于函数Hello()

4

2 回答 2

38

map是不同的,因为它是内置类型而不是函数。访问 a 元素的 2 种形式由Go 语言规范:索引表达式map指定并由编译器支持。

使用功能您无法做到这一点。如果一个函数有 2 个返回值,那么您必须“预期”这两个返回值,或者根本没有。

但是,您可以将任何返回值分配给空白标识符

s, b := Hello()    // Storing both of the return values

s2, _ := Hello()   // Storing only the first

_, b3 := Hello()   // Storing only the second

您也可以选择不存储任何返回值:

Hello()            // Just executing it, but storing none of the return values

注意:您也可以将两个返回值都分配给空白标识符,尽管它没有用(除了验证它恰好有 2 个返回值):

_, _ = Hello()     // Storing none of the return values; note the = instead of :=

您也可以在Go Playground上尝试这些。

辅助函数

如果您多次使用它并且不想使用空白标识符,请创建一个丢弃第二个返回值的辅助函数:

func Hello2() string {
    s, _ := Hello()
    return s
}

现在你可以这样做:

value := Hello2()
fmt.Println(value)
于 2015-02-12T20:35:31.130 回答
2

除了@icza的解释:

  • 我不建议在那里使用辅助函数。特别是如果该Hello功能是您自己的功能。
  • 但是,如果您无法控制它,则可以使用助手。
  • 如果是您自己的函数,最好更改函数的签名。可能,你在某个地方犯了一个设计错误。

你也可以这样做:

package main

import "fmt"

func Hello() (string, bool) {
    return "hello", true
}

func main() {
    // Just move it one line above: don't use a short-if
    value, ok := Hello()
    if ok {
        fmt.Println(value)
    }
}
于 2019-02-23T09:48:02.893 回答