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