是否可以在不使用嵌入式结构的情况下继承类型的方法?
第一段代码是嵌入Property结构的工作代码,Node我可以调用node.GetString它是一个方法Properties.我不喜欢这个是我初始化时Node我有(?)初始化其中的Properties结构.有没有解决的办法?
package main
import "fmt"
type Properties map[string]interface{}
func (p Properties) GetString(key string) string {
return p[key].(string)
}
type Nodes map[string]*Node
type Node struct {
*Properties
}
func main() {
allNodes := Nodes{"1": &Node{&Properties{"test": "foo"}}} // :'(
singleNode := allNodes["1"]
fmt.Println(singleNode.GetString("test"))
}
Run Code Online (Sandbox Code Playgroud)
最后,我想做类似以下的事情.哪里Node是类型Properties和初始化不需要初始化Property结构了.以下代码不起作用,但可能清楚我的目标是什么.
package main
import "fmt"
type Properties map[string]interface{}
func (p Properties) GetString(key string) string {
return p[key].(string)
}
type Nodes map[string]*Node
type Node Properties
func main() {
allNodes := Nodes{"1": &Node{"test": "foo"}} // :)
singleNode := allNodes["1"]
fmt.Println(singleNode.GetString("test")) // :D
}
Run Code Online (Sandbox Code Playgroud)
我将添加更多将使用Properties方法的结构,这就是我要问的原因.如果我只有Node,我会有方法Node和做.但是因为我发现有Node多余的东西可以为嵌入的所有结构添加相同的方法Properties
我想更确切的问题,我想使用Properties方法Node而不必初始化Properties.
所以你在这里遇到了 Go 的特性。嵌入是一个结构体的方法可以“提升”为存在于另一个结构体上的唯一方法。虽然感觉type Node Properties应该公开Properties上的方法Node,但该语法的效果是Node采用内存布局,Properties而不是其任何方法。
它没有解释为什么做出这种设计选择,但Go Spec至少是具体的(如果干燥的话)。如果你完全按照它看起来的样子来阅读,没有任何解释,那么它是非常准确的:
接口类型的方法集就是它的接口。任何其他类型 T 的方法集由使用接收者类型 T 声明的所有方法组成
GetString有一个类型的接收器,Properties认真Node地,解释规范就像你是一个没有想象力的会计师一样。照这样说:
进一步的规则适用于包含匿名字段的结构,如结构类型部分中所述。
...
如果 xf 是表示字段或方法 f 的合法选择器,则结构体 x 中匿名字段的字段或方法 f 被称为提升。
升级字段的作用与结构的普通字段类似,只是它们不能用作结构的复合文字中的字段名称。
给定一个结构体类型 S 和一个名为 T 的类型,提升的方法将包含在该结构体的方法集中,如下所示:
- 如果 S 包含匿名字段 T,则 S 和 *S 的方法集都包含接收者为 T 的提升方法。*S 的方法集还包含接收者为 *T 的提升方法。
- 如果 S 包含匿名字段 *T,则 S 和 *S 的方法集都包含接收者为 T 或 *T 的提升方法。
关于复合文字的那句话迫使您在创建的Properties每个内容中进行声明Node。
PS嗨杰夫!