1

http://golang.org/ref/spec#RangeClause

RangeClause = ( ExpressionList "=" | IdentifierList ":=" ) "range" Expression .

试图理解范围子句,特别是标识符表达式之间的区别

谢谢。

4

1 回答 1

5

使用range关键字,您可以迭代许多事情并在这样做的同时分配结果。您可以分配给两件事:

  • 标识符(通过IdentifierList
  • 表达式(通过ExpressionList

身份标识

这些是用于内部循环的新变量。它们必须遵守标识符规则(unicode 名称、无空格等)。如果您使用这些,则必须:=在列表和range关键字之间使用运算符。

例子:

for i := range []int{1,2,3} {
    fmt.Println(i)
}

表达式

您不一定需要声明新变量,您可以使用现有变量,甚至可以评估返回存储位置的表达式。几个例子:

分配给指针(Play):

var i = 0

func main() {
    p := &i

    for *p = range []int{1,2,3} {
        fmt.Println(i)
    }
}

返回一个指针并分配它(Play):

var i = 0

func foo() *int {
    return &i
}

func main() {
    for *foo() = range []int{1,2,3} {
        fmt.Println(i)
    }
}
于 2013-11-07T22:55:35.477 回答