小编典典

Go中的Getter和Setter约定

go

案例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
}

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


阅读 678

收藏
2020-07-02

共1个答案

小编典典

实例化结构(或对象,采用面向对象的语言)时,无论如何都不应指定私有字段的值。但是,提供可能以私有字段结尾或以完全不同的方式处理的数据是有意义的。在这种情况下,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…).

2020-07-02