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功能的方法。怎么办呢?
答案 0 :(得分:2)
忽略包(在这种情况下它们无关紧要),您需要为内置len
和range
指定有效类型:
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
。
但是,len
和range
不是M
上的方法,它们是内置的,需要特定类型。嵌入不会改变类型,它会促进从嵌入字段到容器结构的方法。
您可以在Go spec和Effective Go中详细了解详细信息。