不能使用子(type [] Child)作为类型[]节点参数func

时间:2016-02-10 11:59:25

标签: go

这是我的测试代码

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(孩子)没有成功...

1 个答案:

答案 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()
}

也许这也是你应该在你的程序中做的事情。