关于go:不能使用实现接口的struct


Cannot use struct that implements interface

本问题已经有最佳答案,请猛点这里访问。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import"fmt"

type implementation struct {
    d []int
}

func (impl *implementation) getData() interface{} {
    return impl.d
}

type phase struct{}

type data interface {
    getData() interface{}
}

func MakeIntDataPhase() *phase {
    return &phase{}
}

func (p *phase) run(population []data) []data {
    return nil
}

func main() {
    var population []implementation
    MyPhase := MakeIntDataPhase()
    fmt.Println(MyPhase.run(population))

}

在操场上运行以下代码时,出现以下错误:prog.go:30:25: cannot use population (type []implementation) as type []data in argument to MyPhase.run

我刚到歌朗,不明白为什么会这样?

结构implementationdata接口实现方法getData()。在run方法中使用一片implementation还不够吗?

我的推理哪里错了?


这似乎与直觉相反,但由于切片类型在go中的表示方式,[]data[]implementation的类型不同。

这实际上在Go wiki中讨论过

编辑:考虑这个

1
2
var impl []*implementation
var data []data = impl

编译器会抱怨

1
cannot use impl (type []*implementation) as type []data in assignment

这是更多的代码,但实际上您必须创建一个接口切片,正如这个线程中的注释所建议的那样,比如:

1
2
3
4
5
6
7
var impl []*implementation
var data []data

// assuming impl already has values
for _, v := range impl {
    data = append(data, v)
}