web-dev-qa-db-ja.com

構造体のメソッドでフィールドを設定および取得する方法

このような構造体を作成した後:

type Foo struct {
   name string        

}
func (f Foo) SetName(name string){
    f.name=name
}

func (f Foo) GetName string (){
   return f.name
}

Fooの新しいインスタンスを作成し、名前を設定および取得するにはどうすればよいですか?私は次を試しました:

p:=new(Foo)
p.SetName("Abc")
name:=p.GetName()
fmt.Println(name)

名前が空なので、何も印刷されません。それでは、構造体内のフィールドを設定して取得するにはどうすればよいですか?

53
nope

解説(および作業)の例:

package main

import "fmt"

type Foo struct {
    name string
}

// SetName receives a pointer to Foo so it can modify it.
func (f *Foo) SetName(name string) {
    f.name = name
}

// Name receives a copy of Foo since it doesn't need to modify it.
func (f Foo) Name() string {
    return f.name
}

func main() {
    // Notice the Foo{}. The new(Foo) was just a syntactic sugar for &Foo{}
    // and we don't need a pointer to the Foo, so I replaced it.
    // Not relevant to the problem, though.
    p := Foo{}
    p.SetName("Abc")
    name := p.Name()
    fmt.Println(name)
}

テスト を実行して Goのツアー を実行し、メソッドとポインター、およびGoの基本について学習します。

110
Moshe Revah

セッターとゲッターはthatGo to Idiomaticではありません。特に、フィールドxのゲッターの名前はGetXではなく、単にXです。 http://golang.org/doc/effective_go.html#Getters を参照してください

セッターが特別なロジックを提供しない場合、例えば検証ロジックでは、フィールドのエクスポートに問題はなく、setterメソッドもgetterメソッドも提供しません。 (これはJavaバックグラウンドを持つ人にとっては間違っているように感じます。しかし、そうではありません。)

25
Volker

例えば、

package main

import "fmt"

type Foo struct {
    name string
}

func (f *Foo) SetName(name string) {
    f.name = name
}

func (f *Foo) Name() string {
    return f.name
}

func main() {
    p := new(Foo)
    p.SetName("Abc")
    name := p.Name()
    fmt.Println(name)
}

出力:

Abc
4
peterSO