免责声明:我是一个Go noob,学习时偷走了。任何建议是赞赏,但只有当伴随代码示例:-)
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 }
Go抱怨:不能使用newPersons()(类型[]人)作为类型[]模型在返回参数
我的目标是返回一个切片的任何模型类型被请求([] Person,[] FutureModel,[] Terminator2000,w / e)。我缺少什么,如何正确实现这样的解决方案?
这非常类似于我刚才回答的问题:
http://stackoverflow.com/a/12990540/727643
简单的答案是,你是正确的。结构体片不等于struct实现的接口的片。
A [] Person和[]模型具有不同的内存布局。这是因为它们是切片的类型具有不同的内存布局。模型是一个接口值,这意味着在内存中它的大小是两个字。一个字用于类型信息,另一个用于数据。 Person是一个结构,其大小取决于它包含的字段。为了从一个[] Person转换到一个[]模型,你需要循环遍历数组,并为每个元素进行类型转换。
由于这个转换是一个O(n)操作,并且将导致一个新的切片被创建,Go拒绝隐式地做。你可以用下面的代码显式地做。
models := make([]Model,len(persons)) for i,v := range persons { models[i] = Model(v) } return models
和dskinner pointed out一样,你最有可能想要一个指针片,而不是一个指向片的指针。通常不需要指向slice的指针。
*[]Person // pointer to slice []*Person // slice of pointers
原文地址:https://www.jb51.cc/go/187745.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。