如何在Golang中初始化接口数组?

时间:2018-09-03 12:50:38

标签: go

我想初始化一个包含接口列表的映射,而不必一个接一个地添加它们:

type Pixel struct {
    X float64
    Y float64
}

type Vertex struct {
    X float64
    Y float64
    Z float64
}
type testpair struct {
    filename       string
    values     []interface{}
}
var tests = map[string]testpair{
   "test1": {
               filename: "file1.csv",
               values:  []Pixel{
                           {X: 12.5, Y: 23.4},
                           {X: 17.2, Y: 7.9},
                      }
            },
   "test2": {
               filename: "file2.csv",
               values:  []Vertex{
                           {X: 10.7, Y: 13.3, Z: 25.1},
                           {X: 18.3, Y: 16.9, Z: 16.4},
                      }
            }, 
}

编译器会输出这样的错误:

  

不能在字段值中使用[] Pixel文字(类型[] Pixel)作为[] interface {}类型

如果我将[] interface {}切换为[] Pixel,则可以初始化地图,但只能使用唯一类型的Pixel或Vertex来完成。

有没有一种方法可以强制编译器在将其声明为接口数组时接受具有特定结构的数组初始化?

4 个答案:

答案 0 :(得分:7)

如果您必须创建一个值片以传递给需要片handler(取决于上下文,可能适当或可能不是适当设计)的东西或任何更特定接口的片,您必须完全指定每个元素,例如:

draw: function(chartArea) {}

这也意味着您可以传递以下信息:

interface{}

这几乎不是您想要的,编译器不会警告您。不过,我认为测试代码没什么大不了的。

答案 1 :(得分:3)

  

有没有一种方法可以强制编译器在声明它为接口数组的同时接受具有特定结构的数组初始化?

不。基本上,您不能强制Go编译器执行任何操作。

另请参阅常见问题解答:https://golang.org/doc/faq#convert_slice_of_interface

您必须提供[]interface{}

但是请停止执行此操作,并提出不需要空接口的操作。

答案 2 :(得分:1)

我遇到了同样的问题,但是将要使用原语,因此这里建议的解决方案需要工作。 在这种情况下,我通过以下方式帮助自己:

args := make([]interface{}, 2)
args[0] = "some string"
args[1] = 1 //some int

答案 3 :(得分:0)

要进行初始化,您需要在接口中输入一种类型,而不是类型数组,因此建议您进行如下更改:

    type Pixel struct {
    X float64
    Y float64
}
type Pixels []Pixel

type Vertex struct {
    X float64
    Y float64
    Z float64
}
type Vertexs []Vertex
type testpair struct {
    filename string
    values   interface{}
}
var tests = map[string]testpair{
    "test1": {
        filename: "file1.csv",
        values: Pixels{
            Pixel{X: 12.5, Y: 23.4},
            Pixel{X: 17.2, Y: 7.9}}},
    "test2": {
        filename: "file2.csv",
        values: Vertexs{
            Vertex{X: 10.7, Y: 13.3, Z: 25.1},
            Vertex{X: 18.3, Y: 16.9, Z: 16.4}}}}