oop - 需要帮助理解 Go 中的导出变量
问题描述
我从 Go 之旅中了解到,大写变量是要导出的,而结构中的小写变量不会被导出。但我正在努力实现其他目标。
在 Java 中,我可以定义一个类Adult
,就像这样
class Adult
{
private int age;
void setAge(int x)
{
if (x >= 18)
this.age = x;
}
}
在 GoLang 中,我知道我可以做类似的事情:
//adult.go
package main
type Adult struct {
age int //Made this lowercase, therefore private. I expect no one messes with this.
}
func (a *Adult) setAge(x int) { //Setter only
if x >= 18 {
a.age = x
}
}
但是,我可以在我的main.go
:
package main
import "fmt"
func (a *Adult) getAge() *int { // This shouldn't be possible?
return &a.age
}
func main() {
var temp *Adult = new(Adult)
temp.setAge(24)
fmt.Println(*temp.getAge())
var this_age_should_be_hidden = temp.getAge() //How do I prevent someone from doing this?
*this_age_should_be_hidden = 5
fmt.Println(*temp.getAge())
}
这让我想到了这个问题的标题。如果我们将变量小写,那有什么意义呢?我们可以总是在结构上定义会暴露未导出变量的方法吗?首先,这不是破坏了小写它的目的吗?
另外,实现我在上面的 Java 版本中所做的事情的 Go 方法是什么?如何确保我的结构的某些字段未设置为类外的无效值?
解决方案
包中将提供私有字段。
根据您的示例考虑以下内容,但将其放在Adult
自己的person
包中:
package person
type Adult struct {
age int //Made this lowercase, therefore private. I expect no one messes with this.
}
func (a *Adult) setAge(x int) { //Setter only
if x >= 18 {
a.age = x
}
}
如果在 person 包中创建一个成年人,可以设置他的年龄。但是,无法从外部包设置年龄:
package main
func main() {
var a person.Adult{}
a.setAge(10) //impossible - method is private
}
如果您需要使用 setter,您可能希望将它们大写以将它们打开到外部包,以便您可以执行以下操作:
package main
func main() {
var a person.Adult{}
a.SetAge(10) //available method
}
推荐阅读
- java - 按键对对象进行分组并创建树
- javascript - 如何使用 Dynamoose 正确查询索引
- spring-boot - Spring Webflux 上传大图像文件并使用 WebClient 以流的方式发送文件
- r - BiodiversityR::rankabundance() 函数不计算 plower 和 pupper 值
- arrays - 如何从分布在数组中多个字节的位中检索值?
- javascript - 从中获取行数
零件 - c - 我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。10^10 不起作用,发生了什么?
- r - I want to simulate and obtain best ARIMA ith number of time in R
- image-processing - skimage 分水岭“过度分割”背后的关键参数
- swift - Xcode 警告:不可变属性将不会被解码,因为它声明了一个不能被覆盖的初始值