英文:
How to set and get fields in struct's method
问题
创建一个这样的结构体之后:
type Foo struct {
name string
}
func (f Foo) SetName(name string) {
f.name = name
}
func (f Foo) GetName() string {
return f.name
}
我该如何创建一个新的Foo实例并设置和获取name?
我尝试了以下代码:
p := new(Foo)
p.SetName("Abc")
name := p.GetName()
fmt.Println(name)
没有输出任何内容,因为name是空的。那么我该如何设置和获取结构体内的字段呢?
英文:
After creating a struct like this:
type Foo struct {
name string
}
func (f Foo) SetName(name string) {
f.name = name
}
func (f Foo) GetName() string {
return f.name
}
How do I create a new instance of Foo and set and get the name?
I tried the following:
p := new(Foo)
p.SetName("Abc")
name := p.GetName()
fmt.Println(name)
Nothing gets printed, because name is empty. So how do I set and get a field inside a struct?
答案1
得分: 143
包括注释(和工作)的示例:
package main
import "fmt"
type Foo struct {
name string
}
// SetName 接收一个指向 Foo 的指针,以便修改它。
func (f *Foo) SetName(name string) {
f.name = name
}
// Name 接收 Foo 的一个副本,因为它不需要修改它。
func (f Foo) Name() string {
return f.name
}
func main() {
// 注意 Foo{}。new(Foo) 只是 &Foo{} 的语法糖,
// 我们不需要一个指向 Foo 的指针,所以我替换了它。
// 不过与问题无关。
p := Foo{}
p.SetName("Abc")
name := p.Name()
fmt.Println(name)
}
测试它 并参考 A Tour of Go 了解更多关于方法和指针以及 Go 的基础知识。
英文:
Commentary (and working) example:
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)
}
Test it and take A Tour of Go to learn more about methods and pointers, and the basics of Go at all.
答案2
得分: 34
设置器和获取器在Go语言中并不是那么惯用的。特别是字段x的获取器不是命名为GetX,而是直接命名为X。请参考http://golang.org/doc/effective_go.html#Getters。
如果设置器没有提供特殊逻辑,例如验证逻辑,那么导出字段并且不提供设置器和获取器方法也没有问题。(对于有Java背景的人来说,这可能感觉不对。但实际上是可以的。)
英文:
Setters and getters are not that idiomatic to Go.
Especially the getter for a field x is not named GetX
but just X.
See http://golang.org/doc/effective_go.html#Getters
If the setter does not provide special logic, e.g.
validation logic, there is nothing wrong with exporting
the field and neither providing a setter nor a getter
method. (This just feels wrong for someone with a
Java background. But it is not.)
答案3
得分: 7
例如,
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
英文:
For example,
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)
}
Output:
Abc
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论