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