重写Go结构方法的默认行为

重写Go结构方法的默认行为,go,methods,overriding,Go,Methods,Overriding,基本上都是问同样的问题 我有 func(f*Foo)String()字符串{ 返回“Foo to string” } 类型栏结构{ *福 } func(b*Bar)字符串()字符串{ 返回“条到字符串” } 我想 将*Foo类型转换为Bar,并 用我自己的重写它String() 但是,我发现我可以重写普通的Foo/Bar函数,比如Call(),但不能用我自己的函数重写String()。详细代码位于 我想要覆盖的实际默认行为是-- 有可能吗?首先:Go中没有方法重写。您可以定义嵌入另一个

基本上都是问同样的问题

我有

func(f*Foo)String()字符串{
返回“Foo to string”
}
类型栏结构{
*福
}
func(b*Bar)字符串()字符串{
返回“条到字符串”
}
我想

  • *Foo
    类型转换为
    Bar
    ,并
  • 用我自己的重写它
    String()
但是,我发现我可以重写普通的Foo/Bar函数,比如
Call()
,但不能用我自己的函数重写
String()
。详细代码位于

我想要覆盖的实际默认行为是--


有可能吗?

首先:Go中没有方法重写。您可以定义嵌入另一个类型的新类型,并为新类型定义相同的函数。这就是你在这里所做的:

type Bar struct {
    *Foo
}
这里,
Bar
是一种新类型,它嵌入了
*Foo
,因此也得到了为
*Foo
定义的所有方法。这与
Foo
的所有方法不同。为
Foo
定义的方法同时为
Foo
*Foo
定义,但是为
*Foo
定义的方法仅为
*Foo
定义,而不为
Foo
定义

在您的示例中,
String
是为
*Foo
定义的,而不是为
Foo
定义的

类似地,当您定义
func(b*Bar)String()String
时,该方法是为
*Bar
定义的,而不是为
Bar
定义的


要使示例正常工作,只需为
Bar
定义
String
func(b Bar)String()String
Bar
上需要一个值接收器:
func(b Bar)String()String
。哇,太简单了。thx!:)哇,很简单。thx!:)