【问题标题】:Getter and Setter conventions in GoGo 中的 Getter 和 Setter 约定
【发布时间】:2017-03-11 19:52:53
【问题描述】:

案例 A 不遵循 Getter & Setter 约定

人类/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
}

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

【问题讨论】:

  • 问问自己:私人名称有什么好处? setter 和 getter 有什么好处。然后决定。
  • 好吧,很好的比喻,如果你问自己同样的问题会说什么

标签: go constructor getter-setter


【解决方案1】:

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

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

在这个简单的示例中,名称被简单地复制到私有字段,但在更复杂的示例中,可能会发生其他操作(例如检查名称是否有效,或查找名称并根据结果……)。

【讨论】:

  • 佐伊德,感谢您的回答。我理解你的 New[YourStructure] 方法,但是,这个大会是官方的吗,我在其他网站上注意到它,但不确定它是否是官方的?他们在github.com/golang 的任何地方使用它吗?
  • 我不知道“官方”,但在 Effective Go (golang.org/doc/effective_go.html#composite_literals) 中提到了它,并且在标准包中到处使用。打开golang.org/pkg中的任意一个包并寻找New,你会发现其中很多函数都叫做NewThing。
  • 我使用它没有问题,我会接受你的回答,但为了争论,我试图找出为什么 Go 创始人以某种方式做事的背后原因,并且背后总有一个深刻的含义,创始人本可以提供构造函数但他们没有,这意味着他们不希望我们使用构造函数。
  • 那么,您正在寻找的可能是FAQ中关于(非)面向对象的部分:golang.org/doc/faq#Is_Go_an_object-oriented_language
  • 谢谢,我发现了一些关于 New golang.org/doc/effective_go.html#composite_literals
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 2013-08-05
  • 2014-05-20
  • 2011-02-26
  • 2011-04-06
相关资源
最近更新 更多