繞過訪問權限,比方說,我有我的項目以下層次:圍棋編程 - 使用指針
fragment/fragment.go
main.go
而在fragment.go
我有下面的代碼,其中一個getter和沒有setter:
package fragment
type Fragment struct {
number int64 // private variable - lower case
}
func (f *Fragment) GetNumber() *int64 {
return &f.number
}
而在main.go我創建了一個Fragment
並試圖改變Fragment.number
沒有二傳手:
package main
import (
"fmt"
"myproject/fragment"
)
func main() {
f := new(fragment.Fragment)
fmt.Println(*f.GetNumber()) // prints 0
//f.number = 8 // error - number is private
p := f.GetNumber()
*p = 4 // works. Now f.number is 4
fmt.Println(*f.GetNumber()) // prints 4
}
所以通過使用指針,我改變了fragment
包之外的私有變量。我明白在例如C中,指針有助於避免複製大型結構/數組,並且它們應該使您能夠更改指向的任何內容。但我不太明白他們應該如何處理私有變量。
所以我的問題是:
- 不宜私有變量留民營,不管他們是如何訪問?
- 這與其他語言如C++/Java相比如何?是否也有這種情況,可以使用類之外的指針來更改私有變量?
我的背景:我知道一點C/C++,很流利的Python和新的Go。我把編程作爲一種愛好學習,所以不瞭解幕後發生的技術事情。
指針是對內存中某個地方的引用。如果你返回一個指向「私有」變量的指針,它仍然指向那個變量;調用者仍然可以更改指針。如果您想強制執行「不變更」限制,請考慮返回對象本身,而不是僅複製副本。 – fuz