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 类型,这样就可以读出里边的值了。

😯,最后再强调一遍,要是你在生产的代码里这么干,被同事打死了可不要说是我教的哈哈哈哈。



更多文章
  • (关系型)数据库优化总结
  • 动态规划民科教程
  • Golang 分布式异步任务队列 Machinery 教程
  • 使用geohash完成地理距离计算
  • 2018年就要到了,这一年都做了什么呢?
  • 算法导论阅读笔记 --- 排序算法
  • 短链系统的实现
  • Git HTTPS 如何保存密码
  • 程序员修炼之道 阅读笔记
  • Python开发实践经验
  • Golang实现平滑重启(优雅重启)
  • traefik 教程
  • Web开发系列(十):事务和锁
  • Web开发系列(十一):数据库扩展
  • Nginx作为TCP/UDP的负载均衡