Go中的多维切片

huangapple go评论126阅读模式
英文:

Multidimensional Slices in Go

问题

我想在Go语言中使用一个具有可变数量元素的数组/切片(在编译时不知道),并且能够动态添加不同类型的新元素,例如:

  1. data[0] := "string"
  2. data[1] // 切片
  3. data[1][0] := "another string"
  4. data[1][1] := 42 // 整数

这种情况是否可能?

英文:

I would like to have an array / slice in Go with a variadic number of elements (not known at compile time) and be able to dinamically add new elements of different types, for instance:

  1. data[0] := "string"
  2. data[1] // slice
  3. data[1][0] := "another string"
  4. data[1][1] := 42 // int

Is this possible somehow?

答案1

得分: 6

这是一个使用空接口interface{}的方法,虽然有点丑陋,但是可行:

  1. package main
  2. import "fmt"
  3. func main() {
  4. variadic := []interface{}{}
  5. variadic = append(variadic, "foo")
  6. variadic = append(variadic, []interface{}{"bar", 42})
  7. // 这将打印出"foo"
  8. fmt.Println(variadic[0])
  9. // 注意,在访问之前,你需要将variadic[1]转换为数组
  10. fmt.Println(variadic[1].([]interface{})[0])
  11. }

如果你允许每个元素都是一个长度可变的任意类型的数组,那么代码会稍微简洁一些:

  1. package main
  2. import "fmt"
  3. func main() {
  4. variadic := [][]interface{}{}
  5. variadic = append(variadic, []interface{}{"foo"})
  6. variadic = append(variadic, []interface{}{"bar", 42})
  7. fmt.Println(variadic[0])
  8. fmt.Println(variadic[1][0])
  9. fmt.Println(variadic[1][1])
  10. }
英文:

It's a bit ugly but possible using empty interfaces, interface{}:

  1. package main
  2. import "fmt"
  3. func main() {
  4. variadic := []interface{}{}
  5. variadic = append(variadic, "foo")
  6. variadic = append(variadic, []interface{}{"bar", 42})
  7. //this will print "foo"
  8. fmt.Println(variadic[0])
  9. //note that you have to cast variadic[1] to an array before accessing it
  10. fmt.Println(variadic[1].([]interface{})[0])
  11. }

If you allow the assumption that each element must be an array of anything with varying length, it's a bit less ugly:

  1. package main
  2. import "fmt"
  3. func main() {
  4. variadic := [][]interface{}{}
  5. variadic = append(variadic, []interface{}{"foo"})
  6. variadic = append(variadic, []interface{}{"bar", 42})
  7. fmt.Println(variadic[0])
  8. fmt.Println(variadic[1][0])
  9. fmt.Println(variadic[1][1])
  10. }

huangapple
  • 本文由 发表于 2014年1月12日 17:37:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/21073192.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定