Go Golang-嵌入类型和;len/range“;
需要不同软件包中的M和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
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()
}