Golang 代码找错

下面的代码是哪里有问题?

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)
}

此处注意三点,其中一二点需要深挖:

  1. Golang 对 interface 继承时候,指针和非指针的区别,区别是:使用指针继承可以改变结构体内部值,使用指针继承可以改变结构体内部值。
  2. type 关键字,对于值类型,传入其指针或值都可以判断。但是对于指针类型,只能传入指针类型才能争取判断。
  3. fmt.Println 内部使用了判断是否是 fmt.Stringer 类型(知识型)
注:提供周末 Golang 培训,凑够三人可以开班,有需求者站短

猜你喜欢

转载自blog.csdn.net/weixin_44328662/article/details/86567849