Dictionary 范围或地图返回什么?
Go具有非常简洁的多返回值范例。但是它看起来像是Dictionary 范围或地图返回什么?,dictionary,go,range,Dictionary,Go,Range,Go具有非常简洁的多返回值范例。但是它看起来像是v,ok:=map[key]和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
v,ok:=map[key]
和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”]
和v:=m[“One”]
-这两个表达式都可以正常工作。
为什么会有这种不同的行为?从内置的
映射
中提取,使用映射、数组或切片上的范围
,以及类型断言
允许一个或两个变量。对于用户定义的函数和方法,情况并非如此。如果函数声明了两个返回值,则必须说明如何处理这两个值,或者忽略这两个值:
k, _ := f2() // Specify what to do with each returned value
f2() // Ignoring both
为什么??因为说明书上说是这样的:
map[K]V类型的映射上的索引表达式可用于特殊形式的赋值或初始化
v、 ok=a[x]v、 确定:=a[x]
var v,ok=a[x] 其中,索引表达式的结果是一对类型为(V,bool)的值。在这种形式下,如果键x出现在地图中,ok的值为真,否则为假。v的值是单个结果形式中的值a[x] 对于每个迭代,生成的迭代值如下所示: 范围表达式:m映射[K]V
第一个值:k键
第二个值(如果存在第二个变量):m[k]V 对于接口类型为x的表达式和类型为T的表达式,主表达式
x、 (T)
断言x不是nil,并且存储在x中的值是T类型 及 如果在表单的赋值或初始化中使用类型断言
v、 ok=x(T)
v、 确定:=x(T)
var v,ok=x.(T)
断言的结果是一对类型为(T,bool)的值