来自数组或切片的多重赋值

Kan*_* Li 6 go

在 Go 中是否有可能将数组解包为多个变量,就像在 Python 中一样。

例如

var arr [4]string = [4]string {"X", "Y", "Z", "W"}
x, y, z, w := arr
Run Code Online (Sandbox Code Playgroud)

我发现这在 Go 中不受支持。我有什么办法可以避免写作x,y,z,w=arr[0],arr[1],arr[2],arr[3]

更重要的是,是否有可能支持类似的东西

var arr []string = [4]string {"X", "Y", "Z", "W"}
x, y, z, w := arr
Run Code Online (Sandbox Code Playgroud)

请注意,它现在是一个切片而不是数组,因此编译器将隐式检查 len(arr)==4 并报告错误。

zzz*_*zzz 6

正如您已经正确地理解的那样,Go 不支持此类构造。IMO,他们不太可能成为这样的人。Go 设计者更喜欢正交性是有充分理由的。例如,考虑分配:

  • LHS 类型与 RHS 类型匹配(在第一个近似值中)。
  • 左侧的“homes”数量与右侧的“source”(表达式)数量相匹配。

Python 不重视这些原则的方式可能在某些地方有些实用。但是,当语言遵循简单、规则的模式时,阅读大型代码库时的认知负荷会较低。


小智 5

这可能不是您想要的,但它确实提供了类似的结果:

package main

func unpack(src []string, dst ...*string) {
   for ind, val := range dst {
      *val = src[ind]
   }
}

func main() {
   var (
      a = []string{"X", "Y", "Z", "W"}
      x, y, z, w string
   )
   unpack(a, &x, &y, &z, &w)
   println(x, y, z, w)
}
Run Code Online (Sandbox Code Playgroud)