从数组或切片进行多次赋值

时间:2013-07-29 21:33:38

标签: go

Go中是否可以将数组解包为多个变量,例如Python。

例如

var arr [4]string = [4]string {"X", "Y", "Z", "W"}
x, y, z, w := arr

我发现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

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

2 个答案:

答案 0 :(得分:3)

正如您所知,Go不支持此类构造。国际海事组织,它们不可能永远存在。设计师喜欢正交性有充分​​的理由。例如,考虑分配:

  • LHS类型与RHS类型匹配(在第一个近似值中)。
  • LHS中“家”的数量与RHS中“来源”(表达式)的数量相匹配。

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

答案 1 :(得分:0)

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

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)
}