下面的代码是哪里有问题?
type Orange struct {
Quantity int
}
func (o *Orange) Increase(n int) {
o.Quantity += n
}
func (o *Orange) Decrease(n int) {
o.Quantity -= n
}
func (o *Orange) String() string {
return fmt.Sprintf("%v", o.Quantity)
}
func main() {
var orange Orange
orange.Increase(10)
orange.Decrease(5)
fmt.Println(orange)
}
解答:
注意这里的 String() 方法,它是实现了 fmt.Stringer() 接口。但是 String()不会被调用,是因为 String() 定义在了指针上,而不是值上。
var orange Orange
orange.Increase(10)
orange.Decrease(5)
fmt.Println(orange)
// Output: {5}
orange := &Orange{}
orange.Increase(10)
orange.Decrease(5)
fmt.Println(orange)
// Output: 5
这里需要我们重新定义 String()方法如下:
func (o Orange) String() string {
return fmt.Sprintf("%v", o.Quantity)
}
此处注意三点,其中一二点需要深挖:
- Golang 对 interface 继承时候,指针和非指针的区别,区别是:使用指针继承可以改变结构体内部值,使用指针继承可以改变结构体内部值。
- type 关键字,对于值类型,传入其指针或值都可以判断。但是对于指针类型,只能传入指针类型才能争取判断。
- fmt.Println 内部使用了判断是否是 fmt.Stringer 类型(知识型)
注:提供周末 Golang 培训,凑够三人可以开班,有需求者站短