ケース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ゲッターとセッターの規則に従う
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}
}
この簡単な例では、名前は単にプライベートフィールドにコピーされますが、より複雑な例では、他の操作が行われる可能性があります(たとえば、名前が有効かどうかの確認、名前の検索と結果に応じたアクションの実行など) 。