为什么可以';我们是否将切片或贴图嵌入Go结构

为什么可以';我们是否将切片或贴图嵌入Go结构,go,struct,composition,embedding,Go,Struct,Composition,Embedding,我了解到,不允许在Go结构中嵌入切片或贴图。但我找到了两个解决办法: 在结构外部声明切片或映射,并将其嵌入到结构中 var mySlice []int type myStruct struct { mySlice } type myStruct struct { mySlice []int } 我不太理解第二种解决方法,但我发现它叫做Composition,在结构中声明切片或映射时,只需省略var关键字即可 var mySlice []int type myStruct str

我了解到,不允许在Go结构中嵌入切片或贴图。但我找到了两个解决办法:

  • 在结构外部声明切片或映射,并将其嵌入到结构中

    var mySlice []int
    
    type myStruct struct {
      mySlice
    }
    
    type myStruct struct {
      mySlice []int
    }
    
  • 我不太理解第二种解决方法,但我发现它叫做Composition,在结构中声明切片或映射时,只需省略var关键字即可

    var mySlice []int
    
    type myStruct struct {
      mySlice
    }
    
    type myStruct struct {
      mySlice []int
    }
    
  • 我的第一个问题是,有人能解释为什么我们不能直接将切片和贴图嵌入到结构中吗

    第二个问题:使用第二种变通方法,是否会对性能产生负面影响

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

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

    不能嵌入像
    map[int]string
    这样的匿名类型。等级库需要类型名。即使您可以嵌入它,它也会包含括号,这会使它失去作为标识符的资格,而且spec再次指出,非限定类型名充当字段名

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

    type mymap map[int]string
    
    type s struct {
        mymap
    }
    
    在结构中嵌入类型时,会忽略字段名。在第二次尝试中:

    type myStruct struct {
        mySlice []int
    }
    

    您没有忽略字段名(它是
    mySlice
    ),因此这不是嵌入,它是一个常规的命名字段。

    Second不是一个“解决方法”-您只是在结构中声明了一个字段。你在选项1中所做的肯定是无效的。选项2中的内容看起来完全是标准的。你说“将切片和贴图嵌入结构”是什么意思?你能举一个你称之为“嵌入”的例子吗?@AmitKumarGupta他们可能键入了
    var
    ->
    type
    。那么它就行了。@AmitKumarGupta,我不明白你说的选项1无效是什么意思,但它行得通。我在这个网站上看到的短语“将切片和映射嵌入结构”的意思是:您的第一个示例无效,不是因为您无法将切片嵌入结构,而是因为您无法将变量嵌入结构
    mySlice
    是命名变量,而不是类型。如果您将其更改为
    类型mySlice[]int
    ,则其他coe工作正常。