
在Go语言中,将向量(这里指container/vector)嵌入到结构体中,需要注意向量的初始化和指针的使用。直接在结构体中声明vector类型变量,可能会导致未初始化的向量在使用时出现问题。因此,推荐使用指针来引用向量,并在使用前进行初始化。
package mainimport "container/vector"type Point struct { x, y int}type MyStruct struct { MyVectorInsideStruct *vector.Vector}func main() { var myMyStruct MyStruct myMyStruct.MyVectorInsideStruct = new(vector.Vector) // 初始化向量 myPoint := Point{2, 3} myMyStruct.MyVectorInsideStruct.Push(myPoint) // 访问向量中的元素 firstPoint := myMyStruct.MyVectorInsideStruct.At(0).(Point) // 类型断言 println(firstPoint.x, firstPoint.y) // 输出: 2 3}
代码解释:
type Point struct { x, y int }: 定义了一个Point结构体,包含x和y两个整数类型的字段。*`type MyStruct struct { MyVectorInsideStruct vector.Vector }**: 定义了一个MyStruct结构体,其中MyVectorInsideStruct字段是一个指向container/vector.Vector`类型的指针。var myMyStruct MyStruct: 声明了一个MyStruct类型的变量myMyStruct。myMyStruct.MyVectorInsideStruct = new(vector.Vector): 关键步骤! 使用new(vector.Vector)初始化MyVectorInsideStruct指针。 如果没有这一步,MyVectorInsideStruct将是一个nil指针,尝试对其进行操作会导致panic。myPoint := Point{2, 3}: 创建一个Point类型的实例myPoint,并赋值。myMyStruct.MyVectorInsideStruct.Push(myPoint): 将myPoint添加到MyVectorInsideStruct指向的向量中。firstPoint := myMyStruct.MyVectorInsideStruct.At(0).(Point): 从向量中获取第一个元素,并使用类型断言将其转换为Point类型。 At()方法返回的是interface{}类型,需要进行类型断言才能使用其具体的类型。
注意事项:
向量初始化: 必须使用new(vector.Vector)或&vector.Vector{}来初始化结构体中的向量指针,否则会引发运行时错误。类型断言: 从container/vector中取出的元素是interface{}类型,需要进行类型断言才能转换为实际类型。container/vector 已过时: container/vector 包在 Go 1.2 之后被标记为过时。 推荐使用 slices 包(Go 1.18 引入)或者 list 包(双向链表)。 如果对性能有较高要求,使用 slices 通常是更好的选择。
使用 slices 包的例子:
立即学习“go语言免费学习笔记(深入)”;
package mainimport "fmt"type Point struct { x, y int}type MyStruct struct { MyPoints []Point}func main() { myMyStruct := MyStruct{ MyPoints: []Point{}, // 初始化切片 } myPoint := Point{2, 3} myMyStruct.MyPoints = append(myMyStruct.MyPoints, myPoint) fmt.Println(myMyStruct.MyPoints[0].x, myMyStruct.MyPoints[0].y) // 输出: 2 3}
总结:
在Go语言中,将向量嵌入结构体需要特别注意向量的初始化。使用指针可以避免未初始化的问题,但必须在使用前通过new()或&操作符进行初始化。同时,注意类型断言的使用。建议使用Go 1.18 之后引入的 slices 包代替过时的 container/vector 包,以获得更好的性能和更简洁的语法。
以上就是Go语言结构体中嵌入向量的正确姿势的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1392372.html
微信扫一扫
支付宝扫一扫