【问题标题】:Why can't we embed slices or maps into Go structs为什么我们不能将切片或映射嵌入到 Go 结构中
【发布时间】:2020-04-08 21:56:46
【问题描述】:

我了解到不允许将切片或映射嵌入到 Go 结构中。但我找到了两种解决方法:

  1. 在结构外声明切片或映射并将其嵌入到结构中

    var mySlice []int
    
    type myStruct struct {
      mySlice
    }
    
  2. 我不太了解第二种解决方法,但我发现它被称为 Composition,它是通过在结构中声明切片或映射时省略 var 关键字来完成的

    type myStruct struct {
      mySlice []int
    }
    

我的第一个问题是,谁能解释为什么我们不能直接将切片和映射嵌入到结构中?

第二个问题:使用第二个解决方法,是否会对性能产生负面影响?

第三个问题:为什么第一个和第二个解决方法有效?

【问题讨论】:

  • Second 不是“解决方法”-您只是在结构中声明了一个字段。 tour.golang.org/moretypes/2
  • 您在选项 1 中的内容绝对无效。选项 2 中的内容看起来完全标准。当您说“将切片和映射嵌入结构”时,您是什么意思?你能举一个你称之为“嵌入”的例子吗?
  • @AmitKumarGupta 他们可能打错了var -> type。然后就可以了。
  • @AmitKumarGupta,我不明白你的意思是选项 1 无效,但它有效。我所说的“将切片和映射嵌入结构”的意思是我在这个网站上看到的:mariadesouza.com/2017/09/29/embedding-in-go
  • 您的第一个示例无效,不是因为您不能将切片嵌入到结构中,而是因为您不能将 变量 嵌入到结构中。 mySlice 是命名变量,而不是类型。如果您将其更改为 type mySlice []int,则您的 coe 的其余部分工作正常。

标签: go struct composition embedding


【解决方案1】:

Spec: Struct types:

使用类型声明但没有显式字段名称的字段称为嵌入字段。必须将嵌入字段指定为类型名称T 或指向非接口类型名称*T 的指针,而T 本身可能不是指针类型。非限定类型名称充当字段名称。

你不能嵌入像map[int]string 这样的类型,这是一个匿名类型。 Spec 需要一个类型名称。即使你可以嵌入它,它也包含括号,这会使它失去作为标识符的资格,并且再次,规范说 不合格的类型名称充当字段名称

只需为其创建一个新类型即可嵌入:

type mymap map[int]string

type s struct {
    mymap
}

在结构中嵌入类型时,会省略字段名称。在您的第二次尝试中:

type myStruct struct {
    mySlice []int
}

您没有省略字段名称(mySlice),所以这不是嵌入,而是一个常规的命名字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2016-10-20
    • 1970-01-01
    • 2023-03-13
    • 2016-08-30
    相关资源
    最近更新 更多