Go 中的 Getter 和 Setter 约定
Getter and Setter conventions in 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
}
以下约定的问题是我无法在提供字段名称时实例化结构。我想使用惯例,但我受困于私人访问。
在实例化一个结构(或对象,在面向对象语言中)时,无论如何都不应该指定私有字段的值。然而,提供可能最终进入私人领域或以完全不同的方式对待的数据是有意义的。在这种情况下,OOP 保证使用构造函数,而 Go 约定是提供一个名为 New[YourStructure] 的函数。
func NewPerson(name string) Person {
return Person{name: name}
}
在这个简单的示例中,名称只是简单地复制到私有字段,但在更复杂的示例中,可能会发生其他操作(例如检查名称是否有效,或查找名称并根据具体情况采取措施)结果...)。
案例 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
}
以下约定的问题是我无法在提供字段名称时实例化结构。我想使用惯例,但我受困于私人访问。
在实例化一个结构(或对象,在面向对象语言中)时,无论如何都不应该指定私有字段的值。然而,提供可能最终进入私人领域或以完全不同的方式对待的数据是有意义的。在这种情况下,OOP 保证使用构造函数,而 Go 约定是提供一个名为 New[YourStructure] 的函数。
func NewPerson(name string) Person {
return Person{name: name}
}
在这个简单的示例中,名称只是简单地复制到私有字段,但在更复杂的示例中,可能会发生其他操作(例如检查名称是否有效,或查找名称并根据具体情况采取措施)结果...)。