gpt4 book ai didi

go - Go 中的 Getter 和 Setter 约定

转载 作者:IT王子 更新时间:2023-10-29 01:27:06 24 4
gpt4 key购买 nike

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

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

以下约定的问题是我无法在提供字段名称时实例化该结构。我想使用惯例,但我受困于私有(private)访问。

最佳答案

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

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

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

关于go - Go 中的 Getter 和 Setter 约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com