Après avoir créé une structure comme celle-ci:
type Foo struct {
name string
}
func (f Foo) SetName(name string){
f.name=name
}
func (f Foo) GetName string (){
return f.name
}
Comment créer une nouvelle instance de Foo, définir et obtenir le nom? J'ai essayé ce qui suit:
p:=new(Foo)
p.SetName("Abc")
name:=p.GetName()
fmt.Println(name)
Rien ne s'imprime, car le nom est vide. Alors, comment définir et obtenir un champ dans une structure?
Commentaire (et exemple de travail):
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)
}
Testez-le et prenez n tour de Go pour en savoir plus sur les méthodes et les pointeurs, ainsi que sur les bases de Go.
Les setters et les getters ne sont pas si idiomatiques à Go. En particulier, le getter d'un champ x ne s'appelle pas GetX mais simplement X. Voir http://golang.org/doc/effective_go.html#Getters
Si le configurateur ne fournit pas de logique spéciale, par ex. Dans la logique de validation, il n’ya rien de mal à exporter le champ et à ne fournir ni méthode de définition ni méthode de lecture. (Cela ne semble pas être bien pour quelqu'un ayant Java de fond. Mais ce n'est pas le cas.)
Par exemple,
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)
}
Sortie:
Abc