【发布时间】:2020-02-14 03:56:33
【问题描述】:
作为一名来自其他语言(如 C++)的程序员,我发现 go 允许为结构指定方法以允许指针或实例作为参数是相当奇怪的。根据go by example,如果我们不想修改原点,可以使用其中任何一个:
Go 自动处理方法调用的值和指针之间的转换。您可能希望使用指针接收器类型来避免复制方法调用或允许方法改变接收结构。
考虑以下代码:
package main
import (
"fmt"
)
type Foo struct {}
type Bar struct {}
func (this Foo) String() string {
return "Foo"
}
func (this *Bar) String() string {
return "Bar"
}
func main() {
fmt.Println(Foo{}) // "Foo"
fmt.Println(Bar{}) // "{}"
}
为什么我不能使用两个签名版本来修改结构的 stringify(我不知道它在 go 中实际上是如何调用的)行为?
明确一点:我并不真正关心字符串化,但想了解语言的行为方式。
【问题讨论】:
-
你没有在这里调用任何方法,所以引用并不真正适用。 fmt.Println 和相关函数检查参数是否实现 fmt.Stringer,但类型
Bar没有,只有*Bar有。
标签: go