博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go 成长路上的坑(1)
阅读量:6190 次
发布时间:2019-06-21

本文共 1042 字,大约阅读时间需要 3 分钟。

一、先来看一段代码

package mainimport "fmt"type X struct{}func (x *X) test(){    println("h1",x)}func main(){    a := X{}     a.test()    (&X{}).test()    (X{}).test()}

猜猜他的结果

二、揭晓答案

package mainimport "fmt"type X struct{}func (x *X) test(){    println("h1",x)}func main(){    a := X{}     a.test()   // 正确    (&X{}).test()  // 正确     (X{}).test()  // 报错 cannot call pointer method on X literal}

三、为什么会是这样的

  • 声明赋值后调用指针方法
a :=xa.test()  //正确
指针方法可以调用的条件:       receiver 必须是合法的指针(包括nil) 或者 能够获取实例的地址     a 是一个可以寻址的变量 ,所以可以调用test() 指针方法    When the value is addressable, the language takes care of the common case of invoking a pointer method on a value by inserting the address operator automatically.    翻译:    当值是可被寻址的,go语言会处理通常的情况:        在一个值上面调用它的指针方法,编译器会自动插入一个&取地址操作符
  • (&X{}).test() 正确
指针方法可以调用的条件:       receiver 必须是合法的指针(包括nil) 或者 能够获取实例的地址     (&X{})  是一个合法的指针
  • (X{}).test() 报错
变量名 = 右值    X{}  就是右值    右值 是不可寻址的(unaddressable) ,所以会报错

四、疑问

(X{}).test()    不可寻址 报错了为什么(&X{}).test()   能取到地址了?

转载于:https://www.cnblogs.com/xiaobaiskill/p/10936481.html

你可能感兴趣的文章
提升数据建模的10种技术措施
查看>>
《程序员之禅》一一2.2 佛教中的“小鬼”
查看>>
《计算机系统:系统架构与操作系统的高度集成》——1.5 计算机硬件的演化...
查看>>
《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.19节使用画笔
查看>>
开源分布式关系型数据库 PingCAP 完成 B 轮融资
查看>>
HouseMD v0.2.1 发布,比Btrace更实用运行时诊断工具
查看>>
《威胁建模:设计和交付更安全的软件》——3.11 小结
查看>>
《Python硬件编程实战》——1.3 Python的特点
查看>>
《OpenStack实战指南》—— 1.4 OpenStack与CloudStack的比较
查看>>
《机器人爱好者(第3辑)》——D机器人引领自动驾驶汽车之路
查看>>
《算法基础》——3.9 总结
查看>>
《51单片机应用开发从入门到精通》——1.3 Keil uVision2集成开发环境
查看>>
《C和C++程序员面试秘笈》——1.4 i++与++i哪个效率更高
查看>>
机器人、威胁情报、对抗机器学习以及深度学习是如何影响安全领域的
查看>>
在 Ubuntu 中用 UFW 配置防火墙
查看>>
《敏捷迭代开发:管理者指南》—第2章2.13节后续内容预告
查看>>
《Spring 5官方文档》11集成测试 (二)
查看>>
大型网站的 HTTPS 实践(三):基于协议和配置的优化
查看>>
《HTML与CSS入门经典(第8版)》——第2章 发布Web内容2.1 创建用于本章的示例文件...
查看>>
面向机器学习的自然语言标注2.3 整合数据集
查看>>