内容简介:工程上当然不能这么干,所以这篇文章呢,just for fun :)Go语言里,小写的变量,包外不可访问。前些天,同事说,Ruby有办法直接访问私有变量,我说其实Python也可以。那么问题来了,Go可以吗?答案当然是可以。正常情况下Go没法 直接访问私有变量只是因为编译器不让你这么干,我们绕开它就好了。
工程上当然不能这么干,所以这篇文章呢,just for fun :)
Go语言里,小写的变量,包外不可访问。
前些天,同事说,Ruby有办法直接访问私有变量,我说其实 Python 也可以。那么问题来了,Go可以吗?答案当然是可以。正常情况下 Go 没法 直接访问私有变量只是因为编译器不让你这么干,我们绕开它就好了。
虽然Go没有指针运算,不能直接根据指针运算来取出私有变量,但是有指针和type cast,就有办法访问的。看代码(为了方便,我没有把 这两个放到不同的包里,而是直接放到一个文件里了):
package main
import (
"fmt"
"unsafe"
)
type Demo struct {
private string
youCannotSeeMe int
Trick bool
}
func main() {
d := Demo{private: "hahaha", youCannotSeeMe: 110, Trick: true}
p := unsafe.Pointer(&d)
type Header struct {
NotPrivate string
YouCanSeeMe int
}
fmt.Printf("%+v", *(*Header)(p))
}
执行一下:
$ go run main.go && echo
{NotPrivate:hahaha YouCanSeeMe:110}
原理就是,侵入Demo的实现,取出d的结构体起始地址,然后强转为 Header 类型,这样就可以读出里边的值了。
:hushed:,最后再强调一遍,要是你在生产的代码里这么干,被同事打死了可不要说是我教的哈哈哈哈。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 在CoffeeScript中定义私有成员变量
- 在CoffeeScript中定义私有成员变量
- 在CoffeeScript中定义私有成员变量
- ES6 系列之私有变量的实现
- 如何测试只修改私有类成员变量的void方法?
- Erlang私有函数的私有程度如何?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ASP.NET网页制作教程
王国荣 / 华中科技 / 2002-1 / 78.00元
《ASP.NET网页制作教程:从基本语法学起(附光盘)》分为:基础篇、对象应用篇、案例研究篇。奠定ASP网页制作的基础,使用Server控件制作互动网页,使用ADO.NET访问数据库;计费网费、会员管理、访客计数器Server版、访客留言板、新闻讨论群组、电子贺卡、E-mail自动传送、FIP文件上传、在线投票、在线问卷调查、在线购物、在线考试、广告回旋板、聊天室。一起来看看 《ASP.NET网页制作教程》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
MD5 加密
MD5 加密工具