当前位置: 首页 > 面试题库 >

Go中的Getter和Setter约定

龙俭
2023-03-14
问题内容

案例A 不遵循Getter&Setter约定

human / human.go

package human

type Human interface {
    GetName() string
    SetName(name string)
}

type Person struct {
    Name string
}

func (p Person) GetName() string {
    return p.Name
}

func (p *Person) SetName(name string) {
    p.Name = name
}

main / main.go

package main

func main() {
    john := Person{Name:"john"} // Uppercase Fields are visible
    fmt.Println(john)
}

案例B 遵循getter和setter约定

package human

type Human interface {
    Name() string
    SetName(name string)
}

type Person struct {
    name string
}

func (p Person) Name() string {
    return p.name
}

func (p *Person) SetName(name string) {
    p.name = name
}

main / main.go

package main

func main() {
    john := Person(name: "John") // lowercase name is not visible outside the package
}

以下约定的问题是,在提供其字段名称时无法实例化该结构。我想使用约定,但是我只能使用私有访问。


问题答案:

实例化结构(或对象,采用面向对象的语言)时,无论如何都不应指定私有字段的值。但是,提供可能以私有字段结尾或以完全不同的方式处理的数据是有意义的。在这种情况下,OOP保证使用构造函数,而Go约定是一种提供名为New
[YourStructure]的功能。

func NewPerson(name string) Person {
    return Person{name: name}
}

In this trivial example, the name is simply copied to the private field, but
in a more complex example, other operations could take place (e.g. checking
that the name is valid, or looking up the name and taking action depending on
the result…).



 类似资料:
  • 问题内容: 如果我有以下私人成员: 我应该如何命名我的吸气剂/设置剂: 要么 编辑:或 ? 问题答案: 正确答案是 如果希望根据 8.8 节 : 将JavaBeans API规范 的推断名称大写 (例如,通过JSP中的$ {object.xIndex}访问它们),将它们用作属性。

  • 问题内容: 我的教授真正强调要通过始终使用访问器和更改器来访问私有实例变量来防止隐私泄漏。但是,我必须在班级中使用班级的getter / setter方法吗? 因此,例如,如果我有以下课程: 我想为此编写一个toString()方法。我可以写: 还是我需要做这样的事情: 问题答案: 您可以任一个。但是,您的教授可能会喜欢使用方法而不是直接访问。这就是为什么。 假设您有一个这样的课程: 很简单,对吧

  • 问题内容: 始终建议使用getter / setter访问私有变量。为什么最好将它们声明为public并对其进行访问。无论如何,我们正在使用getter和setter访问它? 问题答案: @mre的回答非常好,您的问题很重要。总结一下:您将对象的字段设置为私有,以控制其他对象使用它的方式。您的对象使用setter来: 限制和验证传递给设置器的数据 隐藏其内部数据结构(服务对其他对象感兴趣,而不是服

  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 利用 getter/setter 可以拦截操作对象的属性,在设置属性前或获取属性前做一些事情。 1. getter get语法将对象属性绑定到查询该属性时将被调用的函数。(MDN) // 语法 var 对象 = { get 属性名() { // 做一些事情 balabala return 值; } }; getter 在获取一个属性时被调用,同时返回 getter 的返回

  • 我写了我自己的AST转换,它应该生成getter和setter方法(在这里创建getter方法)。但是他们不工作,不能理解原因。 使用属性创建注释 我的AST转换代码应该为注释字段创建getter方法 注释检查 在哪个地方我犯了错误? 运行结果: 线程“main”groovy中出现异常。lang.MissingMethodException:没有方法ua的签名。家插科打诨。用法实例getMyCou