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

切片struct!=它实现的接口切片?

切片struct!=它实现的接口切片?

Go
鸿蒙传说 2021-04-30 09:51:39
我有一个接口Model,该接口由struct实现Person。要获得模型实例,我具有以下帮助器功能:func newModel(c string) Model {    switch c {    case "person":        return newPerson()    }    return nil}func newPerson() *Person {    return &Person{}}上面的方法允许我返回正确类型的Person实例(以后可以使用相同的方法轻松添加新模型)。当我尝试执行类似的操作以返回模型切片时,出现错误。代码:func newModels(c string) []Model {    switch c {    case "person":        return newPersons()    }    return nil}func newPersons() *[]Person {    var models []Person    return &models}去抱怨: cannot use newPersons() (type []Person) as type []Model in return argument我的目标是回到请求任何机型的切片(是否[]Person,[]FutureModel,[]Terminator2000,W / E)。我缺少什么,如何正确实施这样的解决方案?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

正如史蒂芬(Stephen)已经回答了这个问题,而您是个初学者,我强调提供建议。


使用go的接口的一种更好的方法不是让构造函数返回您可能习惯于从其他语言(如Java)返回的接口,而是让每个对象独立地拥有一个构造函数,因为它们隐式实现了接口。


代替


newModel(type string) Model { ... }

你应该做


newPerson() *Person { ... }

newPolitician() *Politician { ... }

有Person和Politician两个实现的方法Model。您仍然可以在 接受a的任何地方使用Person或Politician在任何地方使用Model,但是您也可以实现其他接口。


使用您的方法,您将只能Model进行手动转换为另一种接口类型。


假设我有一个Person实现该方法的方法Walk()和一个ModelImplements ShowOff(),以下内容将无法直接使用:


newModel("person").ShowOff()

newModel("person").Walk() // Does not compile, Model has no method Walk

但是,这将:


newPerson().ShowOff()

newPerson().Walk()


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

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