编程 - 使用指针绕过访问权限

use*_*208 5 pointers go

假设我的项目有以下层次结构:

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中,指针有助于避免复制大型结构/数组,并且它们应该能够让您更改它们指向的任何内容.但我不太明白他们应该如何处理私有变量.

所以我的问题是:

  1. 私有变量不应该保密,无论它们如何被访问?
  2. 这与其他语言(如C++/Java)相比如何?是否也是如此,私有变量可以使用类外的指针进行更改?

我的背景:我知道一点C/C++,相当流利的Python和Go的新手.我将编程视为一种爱好,所以对幕后发生的技术事情知之甚少.

zzz*_*zzz 7

没有绕过任何访问权限.如果从任何导入的包中获得*T,那么你总是可以改变*T,即.整个指针,如在作业中.导入的包设计器控制您可以从包中获得的内容,因此访问控制不是您的.

到什么上面所说的限制是针对结构化类型(结构),其中以前仍持有,但访问控制的一个特定领域的更细的粒度由字段名的情况下,即使由一个指针引用的整个结构控制.字段名称必须为大写才能在其包外显示.

Wrt C++:我相信你可以用几十种C++指针类型之一实现相同的功能.不过不确定是哪一个.

Wrt Java:不,Java没有指针.与Go(C,C++,...)中的指针不太匹配.

  • 这是完全正确的.访问不是关于变异 - 它是关于可见性的.你不能*看到包裹外的*frag.number - 访问它是非法的; 但是,如果片段给你一个恰好指向frag.number的指针,那么你可以自由修改它.这在C++中是完全正确的. (2认同)