このような構造体を作成した後:
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)
名前が空なので、何も印刷されません。それでは、構造体内のフィールドを設定して取得するにはどうすればよいですか?
解説(および作業)の例:
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)
}
セッターとゲッターはthatGo to Idiomaticではありません。特に、フィールドxのゲッターの名前はGetXではなく、単にXです。 http://golang.org/doc/effective_go.html#Getters を参照してください
セッターが特別なロジックを提供しない場合、例えば検証ロジックでは、フィールドのエクスポートに問題はなく、setterメソッドもgetterメソッドも提供しません。 (これはJavaバックグラウンドを持つ人にとっては間違っているように感じます。しかし、そうではありません。)
例えば、
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