从如下代码开始:
type Foo struct {
V bool
}
func (f Foo) bar() bool {
return f.V
}
是否允许在不增加主版本号的情况下更改为func (f *Foo) bar() bool
?也就是说,假设您知道您的类型没有线程安全问题.如果是这样,反向更改也是允许的,对吗?
据我所知,任何调用函数的代码,无论变量是值还是指针,在这两个更改之后都将继续编译并按预期工作.
从如下代码开始:
type Foo struct {
V bool
}
func (f Foo) bar() bool {
return f.V
}
是否允许在不增加主版本号的情况下更改为func (f *Foo) bar() bool
?也就是说,假设您知道您的类型没有线程安全问题.如果是这样,反向更改也是允许的,对吗?
据我所知,任何调用函数的代码,无论变量是值还是指针,在这两个更改之后都将继续编译并按预期工作.
根据 comments ,this answer答案提供了一个很好的总结,T
与*T
接收者类型.以下是从func (f Foo) bar() bool
更改为func (f *Foo) bar() bool
会 destruct 现有代码的几个示例.
示例1:T
不可寻址(playground):
type Foo struct {
V bool
}
func (f *Foo) bar() bool { // Change to `(f Foo)` and this will work
return f.V
}
func x() Foo {
return Foo{true}
}
func main() {
fmt.Printf("%v", x().bar())
}
示例2:接口(playground):
type Foo struct {
V bool
}
func (f *Foo) bar() bool { // Change to `(f Foo)` and this will work
return f.V
}
type Fooer interface {
bar() bool
}
func main() {
var x Fooer
x = Foo{}
fmt.Println(x.bar())
}