在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]
具体而言,为什么该陈述之前和之后的输出是不同的。这是如何评估的?谢谢。
答案 0 :(得分:2)
The Go Programming Language Specification
元组赋值分配多值的各个元素 对变量列表的操作。有两种形式。在第一个, 右手操作数是一个单值多值表达式,如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