Go:函数回调返回接口的实现

我有一个处理资源解析的系统(将名称与文件路径匹配等)。它解析文件列表,然后保留指向函数的指针,该函数返回接口实现的实例。


更容易展示。


资源.go


package resource


var (

    tex_types    map[string]func(string) *Texture = make(map[string]func(string) *Texture)

    shader_types map[string]func(string) *Shader  = make(map[string]func(string) *Shader)

)


type Texture interface {

    Texture() (uint32, error)

    Width() int

    Height() int

}


func AddTextureLoader(ext string, fn func(string) *Texture) {

    tex_types[ext] = fn

}

dds.go


package texture


type DDSTexture struct {

    path   string

    _tid   uint32

    height uint32

    width  uint32

}


func NewDDSTexture(filename string) *DDSTexture {

    return &DDSTexture{

        path:   filename,

        _tid:   0,

        height: 0,

        width:  0,

    }

}



func init() {

    resource.AddTextureLoader("dds", NewDDSTexture)

}

DDSTexture完全实现了Texture接口,我只是省略了这些功能,因为它们很大,而不是我的问题的一部分。


编译这两个包时,出现如下错误:


resource\texture\dds.go:165: cannot use NewDDSTexture (type func(string) *DDSTexture) as type func (string) *resource.Texture in argument to resource.AddTextureLoader

我将如何解决这个问题,或者这是接口系统的错误?只是重申:DDSTexture完全实现resource.Texture.


胡子哥哥
浏览 221回答 1
1回答

江户川乱折腾

是的,DDSTexture完全实现resource.Texture.但是命名类型NewDDSTexture (type func(string) *DDSTexture)与未命名类型不同func (string) *resource.Texture:它们的类型标识不匹配:如果两个函数类型相同,则它们具有相同数量的参数和结果值,对应的参数和结果类型相同,并且两个函数都是可变参数或两者都不是。参数和结果名称不需要匹配。命名类型和未命名类型总是不同的。即使您为函数定义了命名类型,它也不起作用:type FuncTexture func(string) *Texturefunc AddTextureLoader(ext string, fn FuncTexture)cannot use NewDDSTexture (type func(string) `*DDSTexture`) as type `FuncTexture` in argument to `AddTextureLoader`在这里,结果值类型不匹配DDSTexturevs. resource.Texture:即使一个实现了另一个的接口,它们的基础类型仍然不同):您不能将一个分配给另一个。您需要NewDDSTexture()返回Texture(没有指针,因为它是一个接口)。func NewDDSTexture(filename string) Texture请参阅此示例。正如我在“将结构指针转换为 golang 中的接口指针”中所解释的那样,您通常不需要指向接口的指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go