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 培训,凑够三人可以开班,有需求者站短
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值