golang:slice of struct!=它实现的接口的切片?

golang:slice of struct!=它实现的接口的切片?,第1张

概述免责声明:我是一个Go noob,学习时偷走了。任何建议是赞赏,但只有当伴随代码示例:-) 我有一个接口模型,它由struct Person实现。 要获得模型实例,我有以下助手函数: func newModel(c string) Model { switch c { case "person": return newPerson() } retur 免责声明:我是一个Go noob,学习时偷走了。任何建议是赞赏,但只有当伴随代码示例:-)

我有一个接口模型,它由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}

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
总结

以上是内存溢出为你收集整理的golang:slice of struct!=它实现的接口的切片?全部内容,希望文章能够帮你解决golang:slice of struct!=它实现的接口的切片?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1273687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存