如何将嵌入式接口分配给golang中的对象
我试图将Baz类型的结构数组分配给嵌入在Foo类型的第二个结构中的Bar类型的接口数组。我一直无法在这里或谷歌的其他地方找到确切的信息。我提供了一个最低限度的工作示例 我得到以下错误: $go运行main.go ./main.go:38:无法在NewFoo的参数中将baz(类型[]*baz)用作类型[]条 如果我的代码不是惯用的go,并且如果我没有完全按照发布问题的标准进行确认,我深表歉意,这是我的第一篇文章如何将嵌入式接口分配给golang中的对象,go,Go,我试图将Baz类型的结构数组分配给嵌入在Foo类型的第二个结构中的Bar类型的接口数组。我一直无法在这里或谷歌的其他地方找到确切的信息。我提供了一个最低限度的工作示例 我得到以下错误: $go运行main.go ./main.go:38:无法在NewFoo的参数中将baz(类型[]*baz)用作类型[]条 如果我的代码不是惯用的go,并且如果我没有完全按照发布问题的标准进行确认,我深表歉意,这是我的第一篇文章 package main import ( "fmt" ) type Fo
package main
import (
"fmt"
)
type Foo struct {
b []Bar
}
type Baz struct {
a, b int
}
type Bar interface {
Multiply() int
}
func (baz *Baz) Multiply() int{
return baz.a * baz.b
}
func NewFoo(bar []Bar) *Foo{
return &Foo{b: bar}
}
func NewBaz() []*Baz {
bazes := make([]*Baz, 2)
bazes[0] = &Baz{a: 1, b: 2}
bazes[1] = &Baz{a: 3, b: 4}
return bazes
}
func main() {
baz := NewBaz()
foo := NewFoo(baz)
for _, f := range foo.b {
fmt.Println("Foo.Multiply ", f.Multiply())
}
}
更新:在进一步阅读和理解建议的相关帖子后,我批准了重复投票。感谢那些为我指明方向的人。对于未来感兴趣的读者,我的最终实现与我的用例一致,如下所示:
package main
import (
"fmt"
)
type Foo struct {
b []Bar
}
type Baz struct {
a, b int
}
type Bar interface { //
Multiply() int
}
func (baz *Baz) Multiply() int {
return baz.a * baz.b
}
func NewFoo(bar []*Baz) *Foo{
f := &Foo{}
f.b = make([]Bar, 2)
fmt.Println("len(bar) ", len(bar), "len(f.b)", len(f.b) )
for i, _ := range f.b {
f.b[i] = bar[i]
}
return f
}
func MakeBaz() []*Baz {
bazes := make([]*Baz, 2)
bazes[0] = NewBaz(1, 2)
bazes[1] = NewBaz(3, 4)
return bazes
}
func NewBaz(aa, bb int) *Baz {
return &Baz{a: aa, b: bb}
}
func main() {
baz := MakeBaz()
foo := NewFoo(baz)
fmt.Printf("%v\n", foo)
for _, f := range foo.b {
fmt.Println("Foo.Multiply ", f.Multiply())
}
}
有两种不同的方法可以做到这一点,但最简单的方法是用Bar嵌入类型Baz。Baz现在可以乘法()并有两个字段(a,b)。您的代码如下所示:
package main
import (
"fmt"
)
type Foo struct {
b []*Baz
}
type Baz struct {
Bar
a, b int
}
type Bar interface {
Multiply() int
}
func (baz *Baz) Multiply() int {
return baz.a * baz.b
}
func NewFoo(bar []*Baz) *Foo {
return &Foo{b: bar}
}
func NewBaz() []*Baz {
bazes := make([]*Baz, 2)
bazes[0] = &Baz{a: 1, b: 2}
bazes[1] = &Baz{a: 3, b: 4}
return bazes
}
func main() {
baz := NewBaz()
foo := NewFoo(baz)
for _, f := range foo.b {
fmt.Println("Foo.Multiply ", f.Multiply())
}
}
在这里玩:
顺便提一下,第一个问题很好。您遇到的错误: 无法将baz(类型[]*baz)用作类型[]条 因为Go不允许将Baz数组分配给Bar数组,即使它允许将Baz分配给Bar变量 要以更简单的形式看到这一点,这很好:
var oneBaz *Baz = &Baz{a: 1, b: 2}
var oneBar Bar = oneBaz
因为Baz类型满足Bar接口,并且可以将Baz对象指定给Bar变量
但这不起作用(即使它看起来可以起作用):
它将抛出与您看到的相同的错误
为了实现这一点,您可能需要实施此相关问题中列出的解决方案之一:
感谢您的解释和回复!我会看一下相关的问题,看看这些备选方案是否适合我的用例。谢谢你提供的信息!我将尝试您的解决方案,并根据@eugenioy的评论将其与相关问题进行比较。p、 谢谢你鼓励我的话!没问题!确保对有助于你的问题的答案进行投票,并在适当的情况下“选择”答案!stackoverflow告诉我这两个答案不会公开出现,因为它们都很有用,但因为我的声誉低于15。
var bazArray []*Baz = make([]*Baz, 2)
var barArray []Bar = bazArray