为什么我们不能将切片或地图嵌入Go结构

我了解到不允许将切片或地图嵌入Go结构中。但是我发现了两种解决方法:

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

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

    type myStruct struct {
      mySlice []int
    }
    

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

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

第三个问题:为什么第一个和第二个解决方法起作用?

simonwong000 回答:为什么我们不能将切片或地图嵌入Go结构

Spec: Struct types:

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

您不能嵌入map[int]string之类的类型,这是一个匿名类型。 Spec需要一个类型名称。即使您可以嵌入它,它也会包含方括号,从而使它失去作为标识符的资格,并且再次,spec指出不合格的类型名称充当字段名称

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

type mymap map[int]string

type s struct {
    mymap
}

在类型中嵌入类型时,将省略字段名称。第二次尝试:

type myStruct struct {
    mySlice []int
}

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

本文链接:https://www.f2er.com/2482046.html

大家都在问