golang 类型断言取不到地址的问题

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
}

报错信息如下:
test\testVar.go:16:19: cannot call pointer method on i.(Integer)
test\testVar.go:16:19: cannot take the address of i.(Integer)

出现这种情况是因为Add方法需要一个Integer指针类型的接收器,而我们传过去的i.(Integer)是个值,且这个值也没有赋给任何变量,所以符号“&”是获取不到地址的。

错误示例

正确的方式是将i.(Integer)赋值给一个变量,或者把方法接收器改成普通类型。

    var i interface{} = a
    c := i.(Integer)
    sum = c.Add(b)
    fmt.Println(sum)

or

func (a Integer) Add(b Integer) Integer {
    return  a + b
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,877评论 0 38
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,354评论 0 6
  • 生命中任何一天的结束,便永不重来。 from 《诱僧》 清晨,还没有迎接这一天的第一缕阳光,空气冰凉的像是处于空调...
    林长夏阅读 314评论 0 2
  • 今天本来还以为是电磁学魔盒的第一节课呢?可是居然是前两个魔盒的总复习,同学们两个魔盒都带了,而我呢一个魔...
    45cbff51831c阅读 361评论 2 1
  • 我梦到四个人在一张方桌上吃饭,田园风的蓝色格子桌布,微弱的光打在我和她脸上,对面的小女孩背光抬头,用带着水汽一般的...
    单喆阅读 147评论 0 0