这是我的测试代码
package main
import "fmt"
type Node interface {
sayHello()
}
type Parent struct {
Name string
}
type Child struct {
Parent
Age int
}
type Children []Child
func (p Parent) sayHello() {
fmt.Printf("Hello my name is %s\n", p.Name)
}
func (p Child) sayHello() {
fmt.Printf("Hello my name is %s and I'm %d\n", p.Name, p.Age)
}
func makeSayHello(n Node) {
n.sayHello()
}
func sayHellos(list []Node) {
for _, p := range list {
makeSayHello(p)
}
}
func main() {
children := []Child{Child{Parent: Parent{Name: "Bart"}, Age: 8}, Child{Parent: Parent{Name: "Lisa"}, Age: 9}}
for _, c := range children {
c.sayHello()
}
makeSayHello( Parent{"Homer"} )
sayHellos( []Node{Parent{"Homer"}} )
sayHellos( []Node{Parent{"Homer"},Child{Parent:Parent{"Maggy"},Age:3}} )
sayHellos( children ) // error : cannot use children (type []Child) as type []Node in argument to sayHellos
}
链接https://play.golang.org/p/7IZLoXjlIK
我不明白。假设我有一个[] Child,我无法修改,我想用un函数接受[] Parent。为什么我有类型错误?
如果我不能或不想通过改变
来解决这个问题children := []Child{...}
到
children := []Node{...}
如何将[] Child转换为[] Node?它还没有?我是否必须执行另一个[]节点来复制我的元素? 我天真地尝试孩子。([] Node)或[] Node(孩子)没有成功...
答案 0 :(得分:1)
结构数组(例如[]Child
)与接口数组(例如[]Node
)相比具有非常不同的内存布局。因此,Go无法隐式执行[]Child
到[]Node
转换,您必须自己执行此操作:
nodes := make([]Node, len(children), len(children))
for i := range children {
nodes[i] = children[i]
}
sayHellos(nodes)
在您提供的示例中,BTW直接调用sayHello
会更有效:
for _, child := range children {
child.sayHello()
}
也许这也是你应该在你的程序中做的事情。