go 成长路上的坑(1)
一、先来看一段代码
package main
import "fmt"
type X struct{}
func (x *X) test(){
println("h1",x)
}
func main(){
a := X{}
a.test()
(&X{}).test()
(X{}).test()
}
猜猜他的结果
二、揭晓答案
package main
import "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 :=x
a.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() 能取到地址了?
go 成长路上的坑(1)的更多相关文章
- go 成长路上的坑(2)
请看代码 代码一 package main import "fmt" func main() { var a Integer = 1 var b Integer = 2 var i ...
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- 记一次synchronized锁字符串引发的坑兼再谈Java字符串
问题描述 业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间.并发下,取IP是有一定策略的,取到IP之后拿IP对应的C ...
- JAVA实用案例之文件导出(JasperReport踩坑实录)
写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...
- 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串
业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...
- JasperReport报表导出踩坑实录
写在最前面 翻了翻博客,因为太忙,已经好久没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六月份的时候写过一篇利用poi文件导入导出的小De ...
- Java避坑宝典《Java业务开发常见错误100例》上线了
写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
- [No00004E]千万不要“拼命”工作——写在滴滴总裁柳青患癌症之后
滴滴快的总裁柳青发内部信,透露自己检查出乳腺癌,她今年才37岁. 9月30日,就是国庆前一天,柳青发了内部信,透露了这个消息,她也说已经做完肿瘤摘除手术,"目前感觉还挺好的".她也 ...
- web前端知识总结
前言: 一直想着整理一下关于前端的知识体系和资料,工作忙了些,挤挤总会有的,资料很多,就看你能不能耐下心坚持去学了,要多学多敲多想,祝你进步~ 学习之前首先要大概了解什么是HTML ,CSS , JS ...
随机推荐
- ubuntu jdk和tomcat配置
先查看linux的版通过file /sbin/init命令,下载对应版本的jdk. 我的ubuntu是64位的(桌面系统),所以下载的是jdk-7u71-linux-x64.tar.gz 在home的 ...
- 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件
作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...
- 安装charles
简介: Charles主要的功能包括: 支持SSL代理.可以截取分析SSL的请求. 支持流量控制.可以模拟慢速网络以及等待时间(latency)较长的请求. 支持AJAX调试.可以自动将json或xm ...
- Python面向对象之面向对象封装案例
面向对象封装案例 封装 封装是面型对象编程的一大特点 面向对象编程的第一步--将属性和方法封装到一个抽象的类中: 外界使用类创建对象,然后让对象调用方法: 对象方法的细节都被封装在类的内部. 一个对象 ...
- 我安装android studio的过程与经历
虽然android studio已经出来两年多了,但是我一直都没真正用过.之前用Eclipse还算用得挺好.我并不是一个专职的android开发者,我是个游戏开发者,打包的时候要用到android.不 ...
- zoj 3768 Continuous Login
Pierre is recently obsessed with an online game. To encourage users to log in, this game will give u ...
- noip模拟赛 whzzt-Conscience
分析:数据中并不存在无解的情况...... 每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能 ...
- HBase的集群搭建
前提:已经安装过jdk,HDFS集群和zookeeper,我的集群规划见HDFS的文章中 1.在1上安装配置hbase 下载:http://mirror.bit.edu.cn/apache/hbase ...
- C#之插入排序
算法描述 1.假定数组第一位为有序序列,抽出后一位元素与有序序列中元素依次比较: 2.如果有序序列元素大于抽出元素,将该元素向后移位: 3.重复前面步骤依次抽取无序序列中首位元素进行比较,直到所有数值 ...
- 总是有人想在android上直连mysql,是猴子请来的逗比吗?
总是有人想在android上直连mysql,都是是猴子请来的逗比吗?