结构体切片是否等同于接口切片实现?
来源:stackoverflow
时间:2024-02-06 21:57:03 140浏览 收藏
哈喽!今天心血来潮给大家带来了《结构体切片是否等同于接口切片实现?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!
问题内容我有一个接口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 }
Go 抱怨: 无法使用 newPersons()(类型 []Person)作为返回参数中的类型 []Model
我的目标是返回请求的任何模型类型的切片(无论是 []Person
、[]FutureModel
、[]Terminator2000
,w/e)。我缺少什么,如何正确实施这样的解决方案?
正确答案
这与我刚刚回答的问题非常相似:https://stackoverflow.com/a/12990540/727643
简短的回答是你是对的。结构体的切片不等于结构体实现的接口的切片。
[]Person
和 []Model
具有不同的内存布局。这是因为它们所属的类型具有不同的内存布局。 Model
是一个接口值,这意味着在内存中它的大小为两个字。一个词代表类型信息,另一个词代表数据。 Person
是一个结构,其大小取决于它包含的字段。为了从 []Person
转换为 []Model
,您需要循环数组并对每个元素进行类型转换。
由于此转换是一个 O(n) 操作并且会导致创建一个新切片,因此 Go 拒绝隐式执行此操作。您可以使用以下代码明确地执行此操作。
models := make([]Model, len(persons)) for i, v := range persons { models[i] = Model(v) } return models
正如 dskinner 指出的,您很可能需要一个指针切片,而不是指向切片的指针。通常不需要指向切片的指针。
*[]Person // pointer to slice []*Person // slice of pointers
以上就是《结构体切片是否等同于接口切片实现?》的详细内容,更多关于的资料请关注golang学习网公众号!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习