gpt4 book ai didi

go - Go中的Supertype如何引用Subtype

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:04 26 4
gpt4 key购买 nike

Go 不支持多态性。如果要在通用类型的保护伞下传递特定类型,则它无法在 Go 中工作。以下一段代码抛出错误。在 Go 中实现相同功能的最佳方法是什么?

package main

import (
"fmt"
)

type parent struct {
parentID string
}

type child1 struct {
parent
child1ID string
}

type child2 struct {
parent
child2ID string
}

type childCollection struct {
collection []parent
}

func (c *childCollection) appendChild(p parent) {
c.collection = append(c.collection, p)
}

func main() {

c1 := new(child1)
c2 := new(child2)

c := new(childCollection)
c.appendChild(c1)
c.appendChild(c2)

}

Go Playground Link

最佳答案

只是因为在这种情况下,Child 类型由 Parent 组成。并不意味着它是那样的东西。这是两种不同的类型,因此不能以这种方式互换。

现在,如果您有一个接口(interface) Parent 并且您的子对象满足该接口(interface),那么我们正在谈论完全不同的事情。

编辑 1

例子

https://play.golang.org/p/i6fQBoL2Uk7

编辑2

package main

import "fmt"


type parent interface {
getParentId() (string)
}

type child1 struct {
child1ID string
}

func (c child1) getParentId() (string) {
return c.child1ID
}

type child2 struct {
child2ID string
}

func (c child2) getParentId() (string) {
return c.child2ID
}

type childCollection struct {
collection []parent
}

func (c *childCollection) appendChild(p parent) {
c.collection = append(c.collection, p)
}

func main() {

c1 := child1{"1"}
c2 := child2{"2"}

c := new(childCollection)
c.appendChild(c1)
c.appendChild(c2)

fmt.Println(c)

}

关于go - Go中的Supertype如何引用Subtype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58029134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com