使用Go语言将地图嵌入到结构中
So in this answerhere, it's stated that one cannot embed a map into a struct in go. However, I was fiddling around with it, and came up with this and it does actually work, and is pretty straight forward.
package main
import (
"fmt"
"runtime"
)
type record struct {
m map[string]int
}
func main() {
practice := record{m:make(map[string]int)}
practice.m["foo"] = 2
fmt.Println(practice.m)
runtime.GC()
}
this prints map[foo:2]
However, my question is that, are there any negative sides to using this implementation of maps in structs, or are is there more efficient ways to do this?
因此在此答案中 在这里,有人说不能在go中将地图嵌入结构中。 但是,我还是在摆弄它,并提出了这个建议,它确实可以正常工作,并且非常简单。 p>
包main
import(
“ fmt“
” runtime“
)
输入记录结构{
m map [string] int
}
func main(){
实践:=记录{m: make(map [string] int)}
Practice.m [“ foo”] = 2
fmt.Println(practice.m)
runtime.GC()
}
code> pre >
这会打印 map [foo:2] code> p>
但是,我的问题是,使用此实现是否有负面影响 结构中的地图,还是有更有效的方法做到这一点? p>
div>
You can do that, it's absolutely fine.
That isn't "embedding". Embedding means something specific — including a nameless field of a named type in a struct. Your map isn't embedded, it's a regular member with the name "m".
- The answer that you linked is slightly misleading: the answer to the question there ("can I flatten this JSON output without a
MarshalJSON
method") is indeed no, but it's not actually true that embedding a map in a struct is forbidden. If you create a named type that is a map type, you can embed it in a struct just fine. It just doesn't output in JSON the way that the person asking that question would have liked.
There aren't any inherent draw backs. Embedding maps in structs is a common practice. The only issues with the implementation would be outside of that, like using a map in favor of a slice when a slice is better. However, that isn't relevant here. Choosing which collection type to use (slice vs array vs map say) is a different discussion and is more based on your data access patterns. In general, it is normal and idiomatic to compose structs with any of Go's collection types (map being one of those).
EDIT: noticed from hobbs answer the misuse of the term embedded in both the question and my answer, as he points out, the map is not 'embedded' that is a specific language feature, this is actually just composition and I should have referred to it as such above.