web-dev-qa-db-ja.com

golangのゲッターとセッターの規則

ケース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
}

次の規則の問題は、フィールド名を指定しているときに構造体をインスタンス化できないことです。コンベンションを利用したいのですが、プライベートアクセスで行き詰まっています。

7
user7014993

構造(またはオブジェクト指向言語ではオブジェクト)をインスタンス化するときは、とにかくプライベートフィールドの値を指定しないでください。ただし、最終的にプライベートフィールドになるか、まったく異なる方法で処理されるデータを提供することは理にかなっています。この場合、OOPはコンストラクターの使用を保証し、Go規則はNew [YourStructure]と呼ばれる関数を提供することです。

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

この簡単な例では、名前は単にプライベートフィールドにコピーされますが、より複雑な例では、他の操作が行われる可能性があります(たとえば、名前が有効かどうかの確認、名前の検索と結果に応じたアクションの実行など) 。

8
Zoyd