分配给Go中的接口列表

分配给Go中的接口列表,go,Go,我有一个接口Foo和一个实现它的结构Foo。我有一个API,它接受一个foo列表,我需要传入我的foo列表,但它不能按预期工作: package main import "fmt" type foo struct { } func (f foo) Do() { fmt.Println("hi") } type Foo interface { Do() } func main() { var f foo var F Foo F = f // com

我有一个接口Foo和一个实现它的结构Foo。我有一个API,它接受一个foo列表,我需要传入我的foo列表,但它不能按预期工作:

package main

import "fmt"

type foo struct {
}

func (f foo) Do() {
    fmt.Println("hi")
}

type Foo interface {
    Do()
}

func main() {
    var f foo
    var F Foo
    F = f // compiles just fine
    var fs []foo
    var Fs []Foo
    Fs = fs // doesn't compile for some reason
}

我肯定我错过了一些明显的东西,因为我是新手,但为什么不编译呢?

一部分接口不是接口-接口的布局和具体结构的布局是不同的。因此,不能将[]foo分配给[]foo

这是一个非常常见的错误,甚至在golang wiki上都有记录:

如果您需要一部分Foo接口,那么您只需制作一个并在循环中分配它们。来自wiki的示例:

var dataSlice []int = foo()
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
for i, d := range dataSlice {
    interfaceSlice[i] = d
}

一片接口不是接口-接口的布局和混凝土结构的布局是不同的。因此,不能将[]foo分配给[]foo

这是一个非常常见的错误,甚至在golang wiki上都有记录:

如果您需要一部分Foo接口,那么您只需制作一个并在循环中分配它们。来自wiki的示例:

var dataSlice []int = foo()
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
for i, d := range dataSlice {
    interfaceSlice[i] = d
}

我看到了,但希望它只适用于接口{},而不是任何给定的接口。啊,多痛苦啊。谢谢你的帮助!我看到了,但希望它只适用于接口{},而不是任何给定的接口。啊,多痛苦啊。谢谢你的帮助!这在官方FAQ中有介绍:我看到了,但不确定它是否仅应用于接口{}切片,或任何使用接口类型声明的切片。接口{}是完全正常的类型,遵循与chan[]int相同的规则。只有struct{}有一个附加规则。这在官方FAQ中有介绍:我看到,但不确定它是否仅应用于接口{}切片,或任何使用接口类型声明的切片。接口{}是完全正常的类型,并遵循相同的规则,如chan[]int。只有结构{}具有附加规则。