Go语言 正在将值插入“类型abc [][]接口{}”

iqjalb3h  于 2023-03-21  发布在  Go
关注(0)|答案(2)|浏览(82)

我正在尝试向type abc [][] interface{}中插入值
我试过这个:
insert := &abc{{0, {"abc", "def"}}}
这将抛出错误:Invalid composite literal type: interface{}
我也试过这个:
insert, _ := json.Marshal([][]interface{}{{0, {"abc", "def"}}})
但这也会引发错误Invalid composite literal type: interface{}
我希望输出如下所示:
[ [ 0, [ "abc", "def" ] ] ]
你能让我知道我哪里出错了,以及如何解决这个问题吗?

6ljaweal

6ljaweal1#

abc的类型允许任何类型,但是你要放入的东西的类型需要定义。你没有定义{"abc", "def"}的类型,你不能示例化接口常量(接口不告诉编译器任何关于字段的信息)。你可以有匿名结构体,但是它们仍然需要定义。
让我们通过示例逐步了解您所拥有的:

x := &abc{}

创建包含零项的外部数组。

x := &abc{{}, {}, {}}

创建具有3个空内部数组的外部数组。

x := &abc{{0, "abc"}}

一个外部数组,包含一个内部数组,具有2个值:0"abc"

x := &abc{{0, {"abc", "def"}}

一个外部数组,包含一个内部数组,具有2个值:0 and ... something?这是一个对象字面值,但没有显式类型,也没有语法正确的隐式类型(隐式类型需要interface{},但不能直接示例化),这是一个错误。

type PairOfStrings struct {
  A string
  B string
}

x := &abc{{0, PairOfStrings{"abc", "def"}}}

现在您已经键入了有问题的结构。

x := &abc{{0, struct {
  A string
  B string
}{"abc", "def"}}}

匿名结构体也是一种丑陋但有效的方法。

x := &abc{{0, []string{"abc", "def"}}}

似乎是最接近你想要的东西虽然。
规则是interface{}可以保存任何定义的东西,它不等同于C#的dynamic对象。

siv3szwd

siv3szwd2#

您也可以使用“make”进行解析,例如:
类型abc [][]接口{}

v := make([][]interface{}, 0)
v2 := make([]interface{}, 0)

v2 = append(v2, 5)
v = append(v, v2)
a := abc(v)
fmt.Println(a)

相关问题