Golang Go语言中定义 []*struct 而不是 []struct 的好处是什么

发布于 1周前 作者 sinazl 来自 Go语言

看到有很多定义是用 []*struct 这种类型,是添加删除的时候更方便?
Golang Go语言中定义 []*struct 而不是 []struct 的好处是什么

15 回复

不是更省空间吗?

更多关于Golang Go语言中定义 []*struct 而不是 []struct 的好处是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


遍历的时候 如果涉及数组元素的修改有差异

按照 C/C++引用和实例区别,应该就是指针指向,Go 语言开发快捷,不过我还是推荐如果有时间把 C 接触下一下,有的问题可以在 C 上找到答案

指针数组 cpu 里计算 不是更加省时省空间?

一个是引用 一个是拷贝

2l 不错,理解数据底层结构就知道用哪种了

因为你只需要创建一个对象,而不是很多个对象 hhhhh

看你想怎么用了,如果你在某个函数体 /类中声明一个 struct[] 的话,这个数组中的结构体的生命周期等同于它的 enclosing scope,但是如果你想让这些东西在其 enclosing scope 生命周期结束后可用的话,就用一个 struct*[] 来保存这些结构体。

如果我把 struct[] 给 return 了呢?生命期一样是离开函数体?

不可以的,C++ 不能返回 type[],只能返回 type*。

首先,[]*struct 还真不一定比 []struct 好
1. 你的 struct 体积本身就可能比它的指针还小
2. 用指针也略微加大了逃逸分析的难度
3. 如果需要频繁地对这整个 slice 进行写时复制的话,后者方便得多,还可以省个锁

好处一般就是省空间、mutation 能统一了,除了刚刚说的那种情况,看你实际需求。

我这样测试了下返回 []struct,是正常的

type sample struct {s string}

func Foo() []sample {
v := []sample{{“aa”},{“bb”}}
return v
}

func main(){
h := Foo()
h[1].s = “damn”
fmt.Print(h)
}

啊哈原来你用的是 Go。我还以为是 C++。

主要是为了一致性.如果全部都是
func (s *struct) xxx() {}
那么显然用[]*struct 更方便.

在Golang(Go语言)中,定义 []*struct 而不是 []struct 有几个显著的好处,主要体现在内存使用、灵活性和性能上:

  1. 内存使用:使用指针数组 []*struct 可以在某种程度上减少内存占用。当结构体较大时,直接存储结构体实例的数组 []struct 会占用大量连续内存空间。而指针数组则只存储指向结构体实例的指针,这些指针通常较小(在64位系统上通常是8字节),可以节省内存,并且可能提高内存局部性,从而改善缓存性能。

  2. 灵活性:指针数组允许你轻松地在不移动整个数组的情况下修改数组中的结构体实例。你可以直接通过指针修改结构体字段,而不需要复制整个结构体。这对于实现复杂的数据结构(如链表、树等)特别有用。

  3. 性能:在某些情况下,使用指针可以提高性能,特别是在需要频繁访问或修改结构体字段时。通过指针直接访问和修改数据可以避免复制结构体带来的开销。

  4. 共享和并发:在并发编程中,使用指针可以更容易地实现数据共享和同步。例如,你可以通过传递指针来在多个goroutine之间共享数据,并使用互斥锁(mutex)来保护对共享数据的访问。

综上所述,[]*struct 提供了更好的内存管理、更高的灵活性和可能的性能优势,特别是在处理大型结构体和复杂数据结构时。然而,它也需要额外的内存分配和可能的空指针检查,因此在实际应用中应根据具体需求权衡利弊。

回到顶部