假设我的项目有以下层次结构:
fragment/fragment.go
main.go
Run Code Online (Sandbox Code Playgroud)
在fragment.go
我有以下代码,有一个getter,没有setter:
package fragment
type Fragment struct {
number int64 // private variable - lower case
}
func (f *Fragment) GetNumber() *int64 {
return &f.number
}
Run Code Online (Sandbox Code Playgroud)
在main.go中我创建了一个Fragment
并尝试在Fragment.number
没有setter的情况下进行更改:
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
}
Run Code Online (Sandbox Code Playgroud)
因此,通过使用指针,我更改了fragment
包外的私有变量.我理解在例如C中,指针有助于避免复制大型结构/数组,并且它们应该能够让您更改它们指向的任何内容.但我不太明白他们应该如何处理私有变量.
所以我的问题是:
我的背景:我知道一点C/C++,相当流利的Python和Go的新手.我将编程视为一种爱好,所以对幕后发生的技术事情知之甚少.
你没有绕过任何访问权限.如果从任何导入的包中获得*T,那么你总是可以改变*T,即.整个指针,如在作业中.导入的包设计器控制您可以从包中获得的内容,因此访问控制不是您的.
到什么上面所说的限制是针对结构化类型(结构),其中以前仍持有,但访问控制的一个特定领域的更细的粒度由字段名的情况下,即使由一个指针引用的整个结构控制.字段名称必须为大写才能在其包外显示.
Wrt C++:我相信你可以用几十种C++指针类型之一实现相同的功能.不过不确定是哪一个.
Wrt Java:不,Java没有指针.与Go(C,C++,...)中的指针不太匹配.