跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Golang 结构体切片,大家的习惯是切片元素是结构体值还是指针(不考虑性能,仅考虑代码优雅)
未分類
6 10 月 2020

Golang 结构体切片,大家的习惯是切片元素是结构体值还是指针(不考虑性能,仅考虑代码优雅)

Golang 结构体切片,大家的习惯是切片元素是结构体值还是指针(不考虑性能,仅考虑代码优雅)

資深大佬 : einsdisp 4

type Foobar struct { } 

切片元素是值

var s []Foobar 

Or:

切片元素是指针

var s []*Foobar 

不考虑性能,仅考考代码优雅性。

前一种切片(元素为值)在循环赋值时有不便之处:

for _, i := range s {  i.xxx = yyy } 

上面的代码实际上是无效的,必须使用索引,于是代码很不优雅:

for i, _ := range s {  s[i].xxx = yyy } 

但后一种切片(元素为指针),在很多使用场景下同样不方便

大佬有話說 (19)

  • 主 資深大佬 : einsdisp

    后一种切片(元素为指针),在很多使用场景下同样不方便。

    在使用切片中的某元素时,常常要先解引用(就是说需要写成类似 `*s[i]` 的形式而非 `s[i]`),感觉同样很不优雅

  • 資深大佬 : zarte

    “`
    for _, i := range s {
    i.xxx = yyy
    }
    “`
    其他语言这样也不行呀。
    我是用这种。

  • 資深大佬 : JeromeCui

    我比较习惯指针,可能是因为我之前写了好几年的 C++吧

  • 資深大佬 : cmdOptionKana

    一律优先用指针,遇到特殊情况才直接用结构体。

    另外在 Go 里,给一个结构体添加方法,官方也是提倡优先对其指针添加方法,像这样 func (foobar *Foobar) Method(){}

  • 資深大佬 : richzhu

    我是用上面那种

  • 資深大佬 : labulaka521

    range 是复制到一个新的对象去了,你再修改也改不到原始的

  • 資深大佬 : simenet

    别问,问就是指针

  • 資深大佬 : dodoa

    喜欢用值类型,虽然指针和值类型在传值修改的影响完全不一样,根据使用场景的不同,各自有各自的优势或者说弊端吧。值类型完全不用考虑内存管理的问题

  • 資深大佬 : coderxy

    用指针,性能即优雅。 就像我声明切片的时候尽量指定容量,看着更舒服。

  • 資深大佬 : keepeye

    指针

  • 資深大佬 : damngood

    指针性能未必更好. 要考虑 gc 和内存分配这些问题.

  • 資深大佬 : Sasasu

    在有 gc 的语言中一切常识都要重新考虑。

    一个指针数组填充时需要 N 次内存分配,创建 N + 1 个对象。

    写起来奔放的话 gc 导致的 cpu 使用会比程序真正用到的还要多。

    STW 延迟还好,但是吞吐量就没有了。

  • 資深大佬 : vvmint233

    所以为啥要加个_, for i := range s {s[i].xxx = yyyy} 也挺好看的啊

  • 資深大佬 : index90

    同样的问题: https://v2ex.com/t/664610

  • 資深大佬 : snowwalf

    for i := range s {
    s[i].xxx = yyy
    }

  • 資深大佬 : useben

    看情况, 小对象直接存值; 大对象一般存指针; 若大对象且频繁创建销毁看情况, 若内存足够直接存值, 若内存紧张存指针, 总之就是 trade-off

    因为切片底层的扩容是根据切片元素分情况的, 值 or 指针. 若是值直接扩容追加到旧内存; 若是指针, 需要判断是否写屏障, 还有 gc 判断啥的, 因此对增加开销.

  • 資深大佬 : lewinlan

    无脑指针即可

  • 資深大佬 : mengzhuo

    99%指针
    1%为了性能才用 struct

  • 資深大佬 : gamexg

    尽量指针,
    极个别为了性能考虑保存为值,但是使用时也尽量使用指针:

    “`
    list1 := make([]Struct1, 1)

    for i, _ := range list1 {
    v := &list1[i]

    v.A = “11”
    }
    “`

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具