Golang中类型为map的匿名字段

6

我曾以为可以通过使用匿名字段来创建有序映射类型:

type customMap struct{
    map[string]string
    ordered []string
}

我希望能够使用customMapInstance["key"]引用地图并遍历ordered。可惜,数组和映射不是有效的匿名字段。我猜测这样做有很好的原因...


你可以在这里看到(http://stackoverflow.com/a/26194639/6309)另一种嵌入未命名类型的尝试。它也失败了。 - VonC
1个回答

8

根据规范:

嵌入类型必须被指定为类型名T或非接口类型名* T的指针,并且T本身不能是指针类型。

可以看到它提到了“类型名称”。

命名类型由(可能有资格的)类型名称指定;未命名类型使用类型文字指定,从现有类型组成新类型。

换句话说,除非将map或slice定义为命名类型,否则它们不能是匿名的。例如:

type MyMap map[string]string

type customMap struct{
    MyMap
    ordered []string
}

然而,即使您嵌入了MyMap或一个切片类型,您仍然无法索引customMap。只有字段和方法才能被“提升”到嵌入结构体中。对于其他所有内容,它们只是另一个字段。在上面的例子中,MyMap 没有任何字段或方法,因此相当于:

type customMap struct{
    MyMap MyMap
    ordered []string
}

我之前尝试过给命名嵌入的变量重命名,但可惜失败了。虽然我没有查看具体实现,但是索引 map 似乎可以调用 m.hashTableLookup(key interface{}) 函数,这样就有可能被提升,是吗?对于通道和发送/接收来说也是一样的。如果能够直接在结构体上使用美观的 [ ]<- 语法,那将非常好。 - Ethan
这与Python或其他动态语言不同,其中索引语法是对魔术方法的调用。直接在结构体上使用[]或<-是不可能的。 - Stephen Weinberg
那么为什么可以匿名嵌入 stringgo playground 链接 - Ibraheem Ahmed
Go语言规范在多年来经历了许多变化。"命名类型"甚至"匿名字段"都不再是规范中使用的术语。然而,在我撰写原始答案时,字符串被认为是一种命名类型。未命名类型是由类型字面量表示且没有标识符作为名称的组合类型,例如结构体、切片、映射等。 - Stephen Weinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接