9

是否有可能在 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 是否存在,如果不是则报告错误。

4

2 回答 2

4

正如您正确理解的那样,Go 不支持此类构造。IMO,他们不太可能会。围棋设计师更喜欢正交性是有充分理由的。例如,考虑分配:

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

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

于 2013-07-29T22:16:11.283 回答
3

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

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)
}
于 2021-03-22T00:05:23.557 回答