Подтвердить что ты не робот

Как устанавливать и получать поля в структурах Golang?

После создания такой структуры:

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)

Ничего не печатается, потому что имя пусто. Итак, как мне установить и получить поле внутри структуры?

4b9b3361

Ответ 1

Комментарий (и рабочий) пример:

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

Протестируйте его и возьмите A Tour of Go в больше узнать о методах и указателях, а также об основных принципах Go.

Ответ 2

Сеттеры и получатели не , которые идиоматичны для Go. В частности, геттер для поля x не называется GetX а просто X. См. http://golang.org/doc/effective_go.html#Getters

Если сеттер не предоставляет особую логику, например, логика проверки, нет ничего плохого в экспорте поле и ни предоставление сеттера, ни приемник метод. (Это просто неправильно для кого-то с Фон Java. Но это не так.)

Ответ 3

Например,

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