Go Golang - 嵌入类型和“len / range”

时间:2018-01-06 18:53:08

标签: go

package m
type M map[int]int
// have methods on M
// can use len and range on M

package n
// need methods of M
type N struct { M }
// methods available
// BUT cannot use len or range on N
// if " type N M " - I lose the methods on M

需要在不同的包中使用M和len / range功能的方法。怎么办呢?

1 个答案:

答案 0 :(得分:2)

忽略包(在这种情况下它们无关紧要),您需要为内置lenrange指定有效类型:

type M map[int]int

func (m *M) SayHi() {
    fmt.Println("Hi!")
}

type N struct{ M }

func main() {
    var foo N
    fmt.Println(len(foo.M))
    for k, v := range foo.M {
        fmt.Printf("%d: %d\n", k, v)
    }
    foo.SayHi()
}

foo.SayHi()有效,因为SayHi被提升为struct N

但是,lenrange不是M上的方法,它们是内置的,需要特定类型。嵌入不会改变类型,它会促进从嵌入字段到容器结构的方法。

您可以在Go specEffective Go中详细了解详细信息。