Go 中的 Getter 和 Setter 约定

2024-02-21

Case A不遵循 Getter & Setter 约定

人类/人类.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.go

package main

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

Case 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.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}
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中的 Getter 和 Setter 约定 的相关文章

随机推荐