gpt4 book ai didi

go - 不能在 func 的参数中使用子项(类型 []Child)作为类型 []Node

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

这是我的测试代码

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,我想将它与接受 []Parent 的 un 函数一起使用。为什么会出现类型错误?

如果我不能或不想通过更改来解决这个问题

children := []Child{...}

children := []Node{...}

我该怎么做才能将 []Child 转换为 []Node ?是不是已经?我必须做另一个 []Node 来复制我的元素吗?我天真地尝试了 children.([]Node) 或 []Node(children) 但没有成功......

最佳答案

与接口(interface)数组(例如[]Node)相比,结构数组(例如[]Child)具有非常不同的内存布局。所以 Go 不会隐式地做 []Child[]Node 的转换,你必须自己做:

nodes := make([]Node, len(children), len(children))
for i := range children {
nodes[i] = children[i]
}
sayHellos(nodes)

顺便说一句,在您提供的示例中,直接调用 sayHello 会更有效:

for _, child := range children {
child.sayHello()
}

可能这也是您在程序中应该做的。

关于go - 不能在 func 的参数中使用子项(类型 []Child)作为类型 []Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314649/

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