在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()
?
答案 0 :(得分:22)
map
不同,因为它是内置的类型而不是函数。访问map
元素的两种形式由Go Language Specification: Index Expressions指定。
使用功能,您无法执行此操作。如果一个函数有2个返回值,你必须“期望”它们两个或根本没有。
但是,您可以将任何返回值分配给Blank identifier:
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)
答案 1 :(得分:0)
除了@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)
}
}