【问题标题】:What does range or map return?范围或地图返回什么?
【发布时间】:2013-11-02 10:56:44
【问题描述】:

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"] - 两个表达式都可以正常工作。 为什么会有不同的行为?

【问题讨论】:

    标签: dictionary go range


    【解决方案1】:

    从内置map 中提取,在映射、数组或切片上使用range,并且type assertions 允许一个两个变量。对于用户定义的函数和方法,情况并非如此。如果一个函数声明了两个返回值,你必须告诉它们如何处理它们,或者忽略它们:

    k, _ := f2() // Specify what to do with each returned value
    f2() // Ignoring both
    

    为什么?因为规范说是这样的:

    Map (indexed expressions):

    类型为 map[K]V 的映射 a 上的索引表达式可用于特殊形式的赋值或初始化

    v, ok = a[x]
    v, 好的 := a[x]
    var v, ok = a[x]

    其中索引表达式的结果是一对类型为 (V, bool) 的值。在这种形式中,如果键 x 存在于映射中,则 ok 的值为 true,否则为 false。 v 的值是单结果形式中的值 a[x]。

    Range (for statement):

    对于每次迭代,迭代值产生如下:

    范围表达式:m map[K]V
    第一个值:键 k K
    第二个值(如果存在第二个变量):m[k] V

    Type assertion:

    对于接口类型的表达式 x 和类型 T,主表达式
    x.(T)
    断言 x 不是 nil 并且存储在 x 中的值是 T 类型。

    如果在表单的赋值或初始化中使用了类型断言
    v, ok = x.(T)
    v, 好的 := x.(T)
    var v, ok = x.(T)
    断言的结果是一对类型为 (T, bool) 的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2016-05-16
      • 2015-02-24
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多