分配给Go中的接口列表
我有一个接口Foo和一个实现它的结构Foo。我有一个API,它接受一个foo列表,我需要传入我的foo列表,但它不能按预期工作:分配给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
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。只有结构{}具有附加规则。