Go 更改函数中的struct字段或返回值

Go 更改函数中的struct字段或返回值,go,Go,最后,这个问题肯定取决于个人偏好。尽管如此,我还是想大胆尝试,找出哪种风格更受欢迎 我最近注意到我的代码中存在不一致之处。我有一个带有一些字段的结构。现在的问题是,当我需要调用一个函数来获取我想要设置的值时,编辑此字段的惯用方法是什么。我是在函数中设置值,还是返回值并在调用函数中设置 type SuperStruct struct { OneValue string AnotherValue string } func (s *SuperStruct) makeAnot

最后,这个问题肯定取决于个人偏好。尽管如此,我还是想大胆尝试,找出哪种风格更受欢迎

我最近注意到我的代码中存在不一致之处。我有一个带有一些字段的结构。现在的问题是,当我需要调用一个函数来获取我想要设置的值时,编辑此字段的惯用方法是什么。我是在函数中设置值,还是返回值并在调用函数中设置

type SuperStruct struct {
    OneValue     string
    AnotherValue string
}

func (s *SuperStruct) makeAnotherValue() {
    s.AnotherValue = "Hello there"
}

func main() {
    superStruct := SuperStruct{}
    superStruct.makeAnotherValue()
}
或(使用相同的结构)


我知道在某些情况下,这些方法中只有一种是有意义的。但我经常发现自己处于一种两者皆有可能的情况。我想第二种方法可以提供更好的保护,但有时这不是问题。

我认为惯用的方法是完全删除您的功能:

func main() {
    superStruct := SuperStruct{AnotherValue:"Hello there"}
}

除非绝对必要,否则不要构建getter/setter/create函数,只需完成所需的工作。如果只是设置一个简单的字段,在大多数情况下,不需要工厂来生成字段值。如果您认为该函数是必需的,那么它需要比这个复杂得多(至少几行),并且通常被称为NewAnotherValue,而不是附加到父结构


通过另一个函数/结构进行的每一次间接寻址都会使代码更难理解。

也许示例的内容要少一点。它是关于复杂的任务,而不仅仅是设定一个值。查询API、IO访问或复杂的收集操作。如果您真的觉得卡住了,请发布实际代码,但我认为go风格非常简单-避免unecc。抽象,使用NewXXX来创建新类型,在这里您想要包装一个复杂的设置,而不是在类型a上的函数中创建类型b(您可以,但没有必要)。
func main() {
    superStruct := SuperStruct{AnotherValue:"Hello there"}
}
func main() {
    superStruct := SuperStruct{}
    ...
    superStruct.AnotherValue = "Hello there"
}