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

Go Golang-嵌入类型和;len/range“;,go,Go,需要不同软件包中的M和len/range功能方法。如何做到这一点?忽略包(在这种情况下,它们无关紧要),您需要为内置len和范围指定有效类型: 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

需要不同软件包中的M和len/range功能方法。如何做到这一点?

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

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
foo.SayHi()
之所以有效,是因为
SayHi
被提升为
struct N

但是,
len
range
不是
M
上的方法,它们是需要特定类型的内置函数。嵌入不会更改类型,它会将方法从嵌入字段提升到容器结构


您可以在和中阅读更多有关详细信息。

len(n.M)
..=范围n.M
。在使用方法之前,如果不重新定义
N
上的方法或将其转换为
M
,就没有其他方法了。实际上,别名可能会起作用,尽管我不确定它们是否用于此目的……别名起作用,对于len/range,但随后我丢失了方法:)实际上,对于,您不会丢失这些方法,您也可以在别名上使用len/range,但不能向其添加新方法。我相信这是为了重构。请注意,别名在标识符之间具有
=
type N=M
是一个别名,
type N M
不是别名,尽管我不知道你会怎么称呼它。谢谢。成功了。也许是因为我是新手,但这似乎不是直觉。
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()
}