首页 > 解决方案 > 如何在golang中初始化一个接口数组?

问题描述

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

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 来完成它。

有没有办法强制编译器接受具有特定结构的数组初始化,同时将其声明为接口数组?

标签: go

解决方案


如果您必须创建一个值切片以传递给需要切片interface{}(取决于上下文,可能是也可能不是适当的设计)或任何更具体接口的切片的东西,您必须完全指定每个元素, 像这样:

[]interface{}{ 
    Pixel{X: 12.5, Y: 23.4},
    Pixel{X: 17.2, Y: 7.9},
}

这也意味着您可以传递以下内容:

[]interface{}{
    Pixel{X: 12.5, Y: 23.4},
    Vertex{X: 10.7, Y: 13.3, Z: 25.1},
}

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


推荐阅读