Dictionary 范围或地图返回什么?

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

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": 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)的值