Go lang中的Getter和Setter约定

6 constructor go getter-setter

案例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
}
Run Code Online (Sandbox Code Playgroud)

主/ main.go

package main

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

案例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
}
Run Code Online (Sandbox Code Playgroud)

主/ main.go

package main

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

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

Zoy*_*oyd 6

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

func NewPerson(name string) Person {
    return Person{name: name}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 然后,您正在寻找的可能是常见问题解答中有关(非)面向对象的部分:https://golang.org/doc/faq#Is_Go_an_object-orientation_language (2认同)