英文:
golang anonymous field of type map
问题
我以为通过使用匿名字段,我可以创建一个有序映射类型:
type customMap struct{
map[string]string
ordered []string
}
这样我就可以通过customMapInstance["key"]
引用映射,并遍历ordered
。然而,看起来数组和映射不是有效的匿名字段。我怀疑这背后有一个很好的原因...
英文:
I thought I'd be able to make an ordered map type by using anonymous fields:
type customMap struct{
map[string]string
ordered []string
}
where I could reference the map with customMapInstance["key"]
and iterate over ordered
. Alas, it appears arrays and maps are not valid anonymous fields. I suspect there's a good reason...
答案1
得分: 8
从规范中可以看出:
>嵌入类型必须指定为类型名T或非接口类型名*T的指针,并且T本身不能是指针类型。
你可以看到它提到了“类型名”。
>命名类型由(可能带限定符的)类型名指定;未命名类型使用类型字面量指定,它由现有类型组成一个新类型。
换句话说,除非将map或slice定义为命名类型,否则它们不能是匿名的。例如:
type MyMap map[string]string
type customMap struct{
MyMap
ordered []string
}
然而,即使嵌入了MyMap或slice类型,你仍然无法对customMap进行索引。只有字段和方法可以在嵌入时“提升”。对于其他所有情况,它们都只是另一个字段。在上面的示例中,MyMap没有任何字段或方法,因此等效于:
type customMap struct{
MyMap MyMap
ordered []string
}
英文:
From the spec:
>An embedded type must be specified as a type name T or as a pointer to a non-interface type name *T, and T itself may not be a pointer type.
You see that it mentions a "type name".
>Named types are specified by a (possibly qualified) type name; unnamed types are specified using a type literal, which composes a new type from existing types.
In other words, a map or slice may not be anonymous unless they are defined as a named type. For example:
type MyMap map[string]string
type customMap struct{
MyMap
ordered []string
}
However, even if you embed MyMap or a slice type, you would still not be able to index customMap. Only fields and methods may be "promoted" when you embed. For everything else they act as just another field. In the above example, MyMap doesn't have any fields or methods and therefore is equivalent to:
type customMap struct{
MyMap MyMap
ordered []string
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论