Go訪問私有變數
工程上當然不能這麼幹,所以這篇文章呢,just for fun :)
Go語言裡,小寫的變數,包外不可訪問。
前些天,同事說,Ruby有辦法直接訪問私有變數,我說其實Python也可以。那麼問題來了,Go可以嗎?答案當然是可以。正常情況下Go沒法 直接訪問私有變數只是因為編譯器不讓你這麼幹,我們繞開它就好了。
雖然Go沒有指標運算,不能直接根據指標運算來取出私有變數,但是有指標和type cast,就有辦法訪問的。看程式碼(為了方便,我沒有把 這兩個放到不同的包裡,而是直接放到一個檔案裡了):
package main import ( "fmt" "unsafe" ) type Demo struct { privatestring youCannotSeeMe int Trickbool } func main() { d := Demo{private: "hahaha", youCannotSeeMe: 110, Trick: true} p := unsafe.Pointer(&d) type Header struct { NotPrivatestring YouCanSeeMe int } fmt.Printf("%+v", *(*Header)(p)) }
執行一下:
$ go run main.go&& echo {NotPrivate:hahaha YouCanSeeMe:110}
原理就是,侵入Demo的實現,取出d的結構體起始地址,然後強轉為 Header 型別,這樣就可以讀出裡邊的值了。
:hushed:,最後再強調一遍,要是你在生產的程式碼裡這麼幹,被同事打死了可不要說是我教的哈哈哈哈。
- ofollow,noindex" target="_blank">https://golang.org/doc/faq#no_pointer_arithmetic