Go 有非常简洁的多返回值范例。但看起来像v, ok := map[key]
and v, k := range m
使用具有相同符号的不同机制。这是一个简单的例子:
func f2() (k, v string) {
return "Hello", "World"
}
func main(){
k := f2() // Doesn't work : multiple-value f2() in single-value context
m := map[string]int{"One": 1}
// It works
v, ok := m["One"]
// How it all work?
v := m["One"]
for k := range m {}
}
在上面的例子中,k := f2()
给出错误为f2
返回两个值,而v, ok := m["One"]
and v := m["One"]
- 两个表达式都可以正常工作,没有任何错误。
为什么会有不同的行为?
从内置中获取map
, using range
在地图、数组或切片上,以及type assertions
允许一个or两个变量。用户定义的函数和方法并非如此。如果函数声明两个返回值,则必须告诉如何处理这两个值,或者忽略这两个值:
k, _ := f2() // Specify what to do with each returned value
f2() // Ignoring both
为什么?因为规范是这样说的:
映射(索引表达式): http://golang.org/ref/spec#Index_expressions
map[K]V 类型的映射 a 上的索引表达式可以用于特殊形式的赋值或初始化
v, 好 = a[x]
v,好的:= a[x]
var v, ok = a[x]
其中索引表达式的结果是一对类型为 (V, bool) 的值。在这种形式中,如果键 x 存在于映射中,则 ok 的值为 true,否则为 false。 v 的值是单结果形式中的值 a[x]。
范围(用于声明): http://golang.org/ref/spec#For_statements
对于每次迭代,迭代值的生成如下:
极差表达式:m map[K]V
第一个值:键 k K
第二个值(如果存在第二个变量):m[k] V
类型断言: http://golang.org/ref/spec#Type_assertions
对于接口类型和类型 T 的表达式 x,主表达式
x.(T)
断言 x 不为 nil,并且存储在 x 中的值是 T 类型。
and
如果在表单的赋值或初始化中使用类型断言
v, ok = x.(T)
v, 好的 := x.(T)
var v, ok = x.(T)
断言的结果是一对类型为 (T, bool) 的值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)