go - 如何在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 来完成它。
有没有办法强制编译器接受具有特定结构的数组初始化,同时将其声明为接口数组?
解决方案
如果您必须创建一个值切片以传递给需要切片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},
}
这几乎不是你想要的,编译器不会警告你。不过,我认为测试代码并没有什么大不了的。
推荐阅读
- go - 如果覆盖率低于某个百分比,则单元测试失败
- azure-eventgrid - 生成aeg-sas-token的关键是什么
- r - 根据两个条件更改变量的值
- swift - UIScrollView 上的 UITableView - 在点击时未调用 didSelectRowAt(手势识别器陷阱点击)
- java - org.gradle.api.UncheckedIOException:
- sapui5 - 我们如何向 sap.m.semantic.FullscreenPage 添加滚动事件?
- algorithm - O(V+E) 和 O(ElogE) 哪个更好?
- regex - 正则表达式搜索窗口大小
- u-boot - Allwinner a64 - 通过热复位从 aarch32 切换到 aarch64
- encoding - 无法使用 MediaCodec 将 PCM 16 位编码的音频编码为 G711-MLAW?