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

拼搏现实的明天。 2022-11-11 13:04 305阅读 0赞

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

  1. type User struct{
  2. Name string
  3. Sex int
  4. }
  5. func (u User) GetName () {
  6. //绑定到结构体上
  7. }
  8. func (u *User) GetSex () {
  9. //绑定到结构体地址上
  10. }

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

  1. func main() {
  2. var a Integer = 1
  3. var b Integer = 1
  4. sum := a.Add(b)
  5. fmt.Println(sum)
  6. var i interface{
  7. } = a
  8. sum = i.(Integer).Add(b) // 报错
  9. fmt.Println(sum)
  10. }
  11. type Integer int
  12. func (a *Integer) Add(b Integer) Integer {
  13. return *a + b
  14. }
  15. Cannot call pointer method on 'i.(Integer)'

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

  1. func main() {
  2. var a Integer = 1
  3. var b Integer = 1
  4. sum := a.Add(b)
  5. fmt.Println(sum)
  6. var i interface{
  7. } = a
  8. sum = i.(Integer) // 报错
  9. sum = sum.Add(b)//使用变量去接收这个值
  10. fmt.Println(sum)//然后再进行调用绑定到地址的方法。
  11. }
  12. type Integer int
  13. func (a *Integer) Add(b Integer) Integer {
  14. return *a + b
  15. }

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读