dongxing2302 2018-10-30 12:24
浏览 16
已采纳

无法使用实现接口的结构

This question already has an answer here:

code:

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))

}

When running following code in playground I got following error: prog.go:30:25: cannot use population (type []implementation) as type []data in argument to MyPhase.run

I am new to golang and I don't understand why is this happening?

Struct implementation implements method getData() from data interface. Isn't it enough to use a slice of implementation in run method?

Where my reasoning is wrong?

</div>
  • 写回答

1条回答 默认 最新

  • douyue1998 2018-10-30 12:32
    关注

    This seems counter-intuitive but []data is of a different type to []implementation because of how slice types are represented in Go.

    This is actually discussed in the the Go Wiki

    Edit: Consider this

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

    The compiler will complain with

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

    It's more code but you actually have to create a slice of your interface as what the comments in this thread recommends, like so:

    var impl []*implementation
    var data []data
    
    // assuming impl already has values
    for _, v := range impl {
        data = append(data, v)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端