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

时间:2018-09-22 07:23:53

标签: go

最后,这个问题肯定取决于个人喜好。尽管如此,我还是想尝试找出哪种样式是首选。

我最近发现我的代码不一致。我有一些领域的结构。现在的问题是,当我需要调用一个函数以获取要设置的值时,该字段的惯用方式是什么?我是在函数内部设置值,还是在调用函数中返回并设置它?

type SuperStruct struct {
    OneValue     string
    AnotherValue string
}

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

func main() {
    superStruct := SuperStruct{}
    superStruct.makeAnotherValue()
}

或(具有相同的结构)

func (s *SuperStruct) makeAnotherValue() string {
    return "Hello there"
}

func main() {
    superStruct := SuperStruct{}
    superStruct.AnotherValue = superStruct.makeAnotherValue()
}

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

每个通过另一个函数/结构的间接调用都使代码难以遵循。