如何在struct';s法

如何在struct';s法,struct,get,set,go,Struct,Get,Set,Go,创建如下结构后: 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.Print

创建如下结构后:

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
}

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

二传手和接球手并不是那种惯用的。 尤其是字段x的getter没有命名为GetX 但是只有X。 看

如果setter不提供特殊逻辑,例如。 验证逻辑,导出没有问题 该字段既不提供setter,也不提供getter 方法。(这对一个有着
Java背景。但它不是。)

Name()将是getter的惯用名称(请参阅)如果getter需要一个副本,它的价格有多高?它真的复制了整个结构吗?@Kugel是的,getter确实复制了整个结构。不要担心拷贝会很贵,除非您的结构特别重。这是一个内存拷贝,不是硬盘拷贝。为什么我们不能一直传递指针,如果我们不想的话就不编辑它呢?它是否与并发更新有关?@Shashwat按值接收本质上是说此方法不会修改该结构,并且使任何人(包括您自己)不太可能在以后对该方法进行破坏性更改。永远不要忘记,您的代码的其他部分可能依赖于同一个结构,如果它被意外修改,则可能会中断。信息隐藏(封装)的部分原因是程序进化。通过直接访问,您不必到处乱扔代码。比如说,在一年后,您确实决定实施验证或一些甚至有点不同的东西。你不想重构一千个不同的地方,只想重构一个文件和一个地方。抛弃其他语言的既定做法和思想并不总是正确的做法。@sat如果你必须重构一千个地方,那么首先可能是你做错了。@sat(以及所有的选民):在Go中重构几千个呼叫站点并没有那么复杂。Gofix仍然存在,其他工具正在快速成熟。最后并非最不重要的一点:仅仅因为您可能希望更改此访问权限而包装所有访问权限违反了YAGNI,并且只有在重构可以通过单独更改getter来完成时才有帮助(没有额外的错误情况,没有其他重构)。我经常听到这种争论。如果API设计得很好,你就不会遇到这些问题,如果API不好,你就失去了一切。在所有类/对象/结构的每个公共属性中添加Setter/Getter是浪费人力和机器时间。我不会向每个公共变量/指针赋值添加逻辑,原因与我不会将所有字符串+串联封装在自定义的
append(a,b)
函数中相同。虽然从技术上讲,您的答案是可行的,但GetFoo()并不是Go中Foo的惯用getter命名:它应该只是Foo()。Zippoxer的答案中有更多细节。这是一个很好的例子,但是对于
GetName()
方法,您不需要通过指针传递它
func(f*Foo)
您应该可以使用
func(f Foo)
,因为您不需要修改刚刚读取/返回的值。@Hoenir:“选择是在方法上使用值接收器还是指针接收器可能很困难,特别是对新手程序员来说。如果有疑问,请使用指针。“。这是一个人为的例子,我们不知道实际结构会有多大。因此,我们使用指针。@peterSO“值接收器可以减少可以生成的垃圾量”,对于这个简单的例子,使用接收器是一种浪费。而且结构不是“大的”“甚至使用指针都没有意义。@Hoenir:我重复一遍。这是一个人为的例子。这不是一个真实的例子。
Abc