The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
admirez

定义 []*struct 而不是 []struct 的好处是什么

  •  
  •   admirez · Feb 19, 2018 · 2590 views
    This topic created in 3009 days ago, the information mentioned may be changed or developed.
    看到有很多定义是用 []*struct 这种类型,是添加删除的时候更方便?
    14 replies    2018-02-22 15:28:11 +08:00
    neoblackcap
        1
    neoblackcap  
       Feb 19, 2018
    不是更省空间吗?
    50infivedays
        2
    50infivedays  
       Feb 19, 2018
    遍历的时候 如果涉及数组元素的修改有差异
    MeteorCat
        3
    MeteorCat  
       Feb 19, 2018 via Android
    按照 C/C++引用和实例区别,应该就是指针指向,Go 语言开发快捷,不过我还是推荐如果有时间把 C 接触下一下,有的问题可以在 C 上找到答案
    choulinlin
        4
    choulinlin  
       Feb 20, 2018 via Android
    指针数组 cpu 里计算 不是更加省时省空间?
    Mitt
        5
    Mitt  
       Feb 20, 2018 via iPhone
    一个是引用 一个是拷贝
    deepzz
        6
    deepzz  
       Feb 20, 2018
    2l 不错,理解数据底层结构就知道用哪种了
    wizardforcel
        7
    wizardforcel  
       Feb 20, 2018
    因为你只需要创建一个对象,而不是很多个对象 hhhhh
    chengluyu
        8
    chengluyu  
       Feb 20, 2018 via iPad
    看你想怎么用了,如果你在某个函数体 /类中声明一个 struct[] 的话,这个数组中的结构体的生命周期等同于它的 enclosing scope,但是如果你想让这些东西在其 enclosing scope 生命周期结束后可用的话,就用一个 struct*[] 来保存这些结构体。
    admirez
        9
    admirez  
    OP
       Feb 20, 2018
    @chengluyu 如果我把 struct[] 给 return 了呢?生命期一样是离开函数体?
    chengluyu
        10
    chengluyu  
       Feb 21, 2018 via iPad
    @admirez 不可以的,C++ 不能返回 type[],只能返回 type*。
    Equim
        11
    Equim  
       Feb 21, 2018
    首先,[]*struct 还真不一定比 []struct 好
    1. 你的 struct 体积本身就可能比它的指针还小
    2. 用指针也略微加大了逃逸分析的难度
    3. 如果需要频繁地对这整个 slice 进行写时复制的话,后者方便得多,还可以省个锁

    好处一般就是省空间、mutation 能统一了,除了刚刚说的那种情况,看你实际需求。
    admirez
        12
    admirez  
    OP
       Feb 22, 2018
    @chengluyu 我这样测试了下返回 []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)
    }
    chengluyu
        13
    chengluyu  
       Feb 22, 2018
    @admirez 啊哈原来你用的是 Go。我还以为是 C++。
    picasso250
        14
    picasso250  
       Feb 22, 2018
    主要是为了一致性.如果全部都是
    func (s *struct) xxx() {}
    那么显然用[]*struct 更方便.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5917 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 01:43 · PVG 09:43 · LAX 18:43 · JFK 21:43
    ♥ Do have faith in what you're doing.