3 回答
TA贡献1820条经验 获得超10个赞
重要的是相同的界面:
package main
import (
"fmt"
)
type Item interface{
fmt.Stringer
}
type ItemA struct {
}
func (a ItemA) String() string {
return "item A"
}
type ItemB struct {
}
func (a ItemB) String() string {
return "item B"
}
func main() {
items := make([]Item, 0)
items = append(items, ItemA{}, ItemB{})
fmt.Printf("Items: %v", items)
}
TA贡献1828条经验 获得超3个赞
您似乎期待的是.Go 不支持非接口类型的动态绑定。因此,您可以使用接口subtype polymorphism
package main
func main(){
var bar Bar
var foo Foo
foo.Symbols = append(foo.Symbols, bar)
}
type Symbol interface {
Symbol()
}
type Base struct {
a int32
}
func (b Base)Symbol(){}
type Foo struct {
Base
b int32
Symbols []Symbol
}
type Bar struct {
Base
c int32
}
或者,如果您不喜欢使用界面,则可以使用如下所示的技巧来反映。
package main
import "fmt"
func main(){
var bar Bar
var foo Foo
err := foo.AddSymbol(bar)
if err != nil{
fmt.Println(err)
}
}
type Base struct {
a int32
}
func (b Base)Symbol(){}
type Foo struct {
Base
b int32
symbol []interface{} // field made private
}
// AddSymbol : helper to append values
func (f *Foo)AddSymbol(in interface{})(err error){
if f.symbol == nil{
f.symbol = make([]interface{},0)
}
switch typ := in.(type) {
case Base,Bar,Foo:
f.symbol = append(f.symbol,in)
default:
return fmt.Errorf("provided type: %s is not supported",typ)
}
return nil
}
type Bar struct {
Base
c int32
}
TA贡献1859条经验 获得超6个赞
我做了一些搜索和阅读。我想要实现的目标需要所谓的“总和类型”。目前 Go 不支持总和类型。但是,很少有替代方法来模拟求和类型的行为。它们在这里得到了很好的描述 Go 中求和类型的替代方案。
更重要的是,看起来总和类型可能会在Go 2中得到支持。进一步阅读建议:规范:添加总和类型/可区分的并集,规范:泛型:使用类型集删除约束中的类型关键字。
- 3 回答
- 0 关注
- 139 浏览
添加回答
举报
