为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2021-09-09 20:24:45
我有一个处理资源解析的系统(将名称与文件路径匹配等)。它解析文件列表,然后保留指向函数的指针,该函数返回接口实现的实例。更容易展示。资源.gopackage resourcevar (    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.gopackage texturetype 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.
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

是的,DDSTexture完全实现resource.Texture.


但是命名类型NewDDSTexture (type func(string) *DDSTexture)与未命名类型不同func (string) *resource.Texture:它们的类型标识不匹配:


如果两个函数类型相同,则它们具有相同数量的参数和结果值,对应的参数和结果类型相同,并且两个函数都是可变参数或两者都不是。参数和结果名称不需要匹配。


命名类型和未命名类型总是不同的。


即使您为函数定义了命名类型,它也不起作用:


type FuncTexture func(string) *Texture

func 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 中的接口指针”中所解释的那样,您通常不需要指向接口的指针。


查看完整回答
反对 回复 2021-09-09
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信