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"
}
}
假设我们有一个函数,它接受一个指向结构 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"
}
}