golang逗号分隔表达式

时间:2018-06-03 15:13:26

标签: go

在go docs中有一个随机的例子(link

我已按如下方式添加了一些输出:

package main

import (
    "fmt"
    "math/rand"
    "strings"
)

func main() {
    words := strings.Fields("ink runs from the corners of my mouth")
    fmt.Println(words)
    rand.Shuffle(len(words), func(i, j int) {
        fmt.Println("Before:", i, j, words[i])
        words[i], words[j] = words[j], words[i]
        fmt.Println("After:", i, j, words[i])

    })
    fmt.Println(words)
}

我想了解的是:

words[i], words[j] = words[j], words[i]

具体而言,为什么该陈述之前和之后的输出是不同的。这是如何评估的?谢谢。

1 个答案:

答案 0 :(得分:2)

  

The Go Programming Language Specification

     

Assignments

     

元组赋值分配多​​值的各个元素   对变量列表的操作。有两种形式。在第一个,   右手操作数是一个单值多值表达式,如a   函数调用,通道或映射操作或类型断言。该   左侧操作数的数量必须与数量匹配   值。例如,如果f是一个返回两个值的函数,

x, y = f()
     

将第一个值分配给x,将第二个值分配给y。在第二种形式,   左边的操作数数量必须等于数量   右边的表达式,每个都必须是单值的,而且   右边的第n个表达式被赋值给第n个操作数   左:

one, two, three = '一', '二', '三'

words[i], words[j] = words[j], words[i]是Go元组赋值的第二种形式。 words[i]words[j]的值互换。

words[i], words[j] = words[j], words[i]

变为:

// on the left
tj := words[j]
ti := words[i]
// on the right
words[i] = tj
words[j] = ti

简化:

t := words[i]
words[i] = words[j]
words[j] = t