【问题标题】:Slice of structs behaviour切片结构行为
【发布时间】:2019-12-28 07:30:07
【问题描述】:

当我们声明一个结构切片,但将数据类型设置为指向该结构的指针时,go 会自动将字面量转换为指针吗?

type book struct {
    id int
    name string
}

var books = []*book {
    {1, "Yellow moon"}, // ---> Is this a pointer to book OR just book
}

【问题讨论】:

  • 当然,它是一个指向书的指针,因为你不能在指向书的指针切片中存储除此之外的任何内容。

标签: pointers go struct slice composite-literals


【解决方案1】:

可以定义有无类型:

https://play.golang.org/p/CB2MDPDztrc

【讨论】:

    【解决方案2】:

    它将是指向book 的指针,与&book{1, "Yellow moon"} 相同,但规范允许省略类型和& 运算符,因为从类型上很明显。

    var books = []*book {
        {1, "Yellow moon"},  // This is the same as &book{1, "Yellow moon"}
    }
    

    Spec: Composite literals:

    在数组、切片或映射类型T 的复合文字中,如果它们与T 的元素或键类型相同,则本身是复合文字的元素或映射键可以省略相应的文字类型。类似地,当元素或键类型为 *T 时,作为复合文字地址的元素或键可以省略 &T

    [][]Point{{{0, 1}, {1, 2}}}  // same as [][]Point{[]Point{Point{0, 1}, Point{1, 2}}}
    
    [2]*Point{{1.5, -3.5}, {}}   // same as [2]*Point{&Point{1.5, -3.5}, &Point{}}
    

    【讨论】:

      【解决方案3】:

      Does go auto convert composite literals inside a slice to pointers if I declare the slice as a pointer to a struct?

      这是指向结构的指针的默认行为

      当我们拥有结构指针 p 时,要访问结构的字段 X,我们可以编写 (*p).X。但是,这种表示法很麻烦,因此该语言允许我们只写 p.X,而无需显式取消引用。

      https://tour.golang.org/moretypes/4

      【讨论】:

      • 字段访问与结构字面量有什么关系?
      • 嗯我想我错了,我以为他的字面意思是字段,对不起
      猜你喜欢
      • 2020-09-12
      • 2018-06-05
      • 2012-02-25
      • 2015-02-21
      • 1970-01-01
      • 2014-08-24
      • 2021-04-14
      相关资源
      最近更新 更多