golang逗号分隔表达式

golang逗号分隔表达式,go,Go,在go docs中有一个洗牌示例() 我向它添加了一些输出,如下所示: 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

在go docs中有一个洗牌示例()

我向它添加了一些输出,如下所示:

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]
具体地说,为什么该语句前后的输出是不同的。这是如何评估的?谢谢

元组分配分配多值数组的各个元素 对变量列表的操作。有两种形式。首先,, 右侧操作数是单个多值表达式,例如 函数调用、通道或映射操作或类型断言。这个 左侧的操作数必须与 价值观例如,如果f是一个返回两个值的函数

x, y = f()
将第一个值指定给x,第二个值指定给y。在第二种形式中, 左侧的操作数必须等于 右侧的表达式,每个表达式都必须是单值表达式,以及 右侧的第n个表达式指定给右侧的第n个操作数 左:


words[i],words[j]=words[j],words[i]
是Go-tuple赋值的第二种形式。将交换
单词[i]
单词[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

谢谢你。我觉得有点傻,因为我把它当作一个单独的表达(单词[I])(单词[j]=单词[j]),然后再(单词[I])。而不是正确的(单词[i],单词[j])=(单词[j],单词[i])。我想我的内部解析器出现了故障——但再次感谢。
t := words[i]
words[i] = words[j]
words[j] = t