doutuan8887
doutuan8887
2016-04-28 23:08

使用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?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • dongwh1992 dongwh1992 5年前
    1. You can do that, it's absolutely fine.

    2. 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".

    3. 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.
    点赞 评论 复制链接分享
  • duankao4489 duankao4489 5年前

    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.

    点赞 评论 复制链接分享