如何将嵌入式接口分配给golang中的对象

如何将嵌入式接口分配给golang中的对象,go,Go,我试图将Baz类型的结构数组分配给嵌入在Foo类型的第二个结构中的Bar类型的接口数组。我一直无法在这里或谷歌的其他地方找到确切的信息。我提供了一个最低限度的工作示例 我得到以下错误: $go运行main.go ./main.go:38:无法在NewFoo的参数中将baz(类型[]*baz)用作类型[]条 如果我的代码不是惯用的go,并且如果我没有完全按照发布问题的标准进行确认,我深表歉意,这是我的第一篇文章 package main import ( "fmt" ) type Fo

我试图将Baz类型的结构数组分配给嵌入在Foo类型的第二个结构中的Bar类型的接口数组。我一直无法在这里或谷歌的其他地方找到确切的信息。我提供了一个最低限度的工作示例

我得到以下错误:

$go运行main.go

./main.go:38:无法在NewFoo的参数中将baz(类型[]*baz)用作类型[]条

如果我的代码不是惯用的go,并且如果我没有完全按照发布问题的标准进行确认,我深表歉意,这是我的第一篇文章

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