web-dev-qa-db-fra.com

Comment définir et obtenir des champs dans la méthode de struct

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?

53
nope

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.

110
Moshe Revah

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.)

25
Volker

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
4
peterSO