Cannot call pointer method on ‘i.(Integer)‘报错

84 篇文章 3 订阅

对于Golang语言实现接口的方法,我们可以绑定到结构体的地址,或者结构体上

type User struct{
	Name string
	Sex int
}
func (u User) GetName () {
	//绑定到结构体上
}
func (u *User) GetSex () {
	//绑定到结构体地址上
}

但是,我们在使用结构体方法时,通过接口进行对数据的断言,将断言后的数据进行调用结构体的方法,此时,如果方法绑定的是结构体的地址,就会报错

func main() {
	var a Integer = 1
	var b Integer = 1
	sum := a.Add(b)
	fmt.Println(sum)

	var i interface{} = a
	sum = i.(Integer).Add(b) // 报错

	fmt.Println(sum)
}

type Integer int

func (a *Integer) Add(b Integer) Integer {
	return  *a + b
}
Cannot call pointer method on 'i.(Integer)'

先说原因:如果方法绑定到结构体的地址上,就会根据结构体的变量地址进行调用方法,但是,通过断言返回的是一个值,并不是一个变量,无法拿到这个值的地址,所以会报错。
知道出错的原因之后,我们可以将代码进行重新编写,也就是在断言之后返回一个值,让变量去接收这个值,然后再进行调用方法。


func main() {
	var a Integer = 1
	var b Integer = 1
	sum := a.Add(b)
	fmt.Println(sum)

	var i interface{} = a
	sum = i.(Integer) // 报错
	sum = sum.Add(b)//使用变量去接收这个值
	fmt.Println(sum)//然后再进行调用绑定到地址的方法。
}

type Integer int

func (a *Integer) Add(b Integer) Integer {
	return  *a + b
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值