elses真的是一种代码味道吗?写 Go 条件的惯用方式

Are elses really a code smell? Idiomatic way to write Go conditions

假设我们有一个函数,它接受一个指向结构 Thing 的指针并有条件地更新它的 val 字段。

type Thing struct {
   good bool
   val string
}

以下哪种方法在 Go 中更为惯用?

这个:

func setVal(t *Thing) {
    if b.good {
        b.val = "Good"
        return
    }
    b.val = "Meh"
}

或者这个:

func setVal(t *Thing) {
   if b.good {
      b.val = "Good"
   } else {
      b.val = "Meh"
   }
}

为什么大惊小怪?

In go if you have an else, that is almost a code smell. If you see elses, think of how you can get rid of them. Very often they will simplify your code actually. -Francesc Campoy

你其实已经回答了你的问题 这是惯用的方式:

func setVal(t *Thing) {
    if b.good {
        b.val = "Good"
        return
    }
    b.val = "Meh"
}

因为它通常看起来更简单。

例如你可以看看这个页面go wiki免责声明:此页面描述的错误处理流程并不完全相同,但思路相同,因此您可以依赖它)。

因为这与“错误流程”无关,所以 else 本身不是代码味道。

但是代码 本身 看起来很不讨人喜欢:像 setVal 方法这样的东西本身就有味道。

对于逻辑本身,我可能会这样写:

func setVal(t *Thing) {
    b.val = "Meh"
    if b.good {
        b.val = "Good"
    }
}