【发布时间】:2021-11-24 08:59:53
【问题描述】:
我有多个具有相同嵌入式结构的结构。在其中一个结构中,我想存储嵌入基本结构的任何结构的列表。这是一个小sn-p展示这个案例。
package main
type Symbol interface{}
type Base struct {
a int32
}
type Foo struct {
Base
b int32
Symbols []Base
// Below works
// Symbols []Symbol
}
type Bar struct {
Base
c int32
}
func main () {
var bar Bar
var foo Foo
foo.Symbols = append(foo.Symbols, bar)
}
但是,这不起作用。我得到./main.go:25:22: cannot use bar (type Bar) as type Base in append。当我使用空的Symbol 接口时,一切正常。然而,这种方法完全绕过了类型系统,因为现在所有内容都可以存储在列表中。我想以某种方式表示只有Base、Foo 和Bar 可以存储在列表中,以便编译器可以检查是否满足此要求。我的结构没有任何方法,肯定不是那些共享行为并且可以添加到接口的方法。向接口和虚拟实现添加一些虚拟方法似乎非常人为。处理此类场景的 Go 惯用方式是什么?
【问题讨论】:
-
不确定,您为什么希望它起作用,
Bar!=Base -
我不希望它起作用。我只是怀疑,他可能是实现我想要实现的目标的一种方式。我错了,我不知道什么是正确/惯用的方式。
-
为了让你的附加工作你想通过类型名称引用匿名嵌入式结构,即
bar.Base:play.golang.org/p/oDvwaymNsaC