Switch 还是 If , 这是个问题

golang的语法里,选择判断的语句有 switch case if else select case 这三个组合。而 select case 通常是搭配 channel 类型使用的,所以暂时不在这篇文章的讨论范围。

通常来说我们更倾向于使用 switch case 而不是 if else , 因为前者更加优雅清晰 , 而且在 c 中,编译器有对switch 语句进行优化 —>出处 。而 golang 因为没有和c一样生成跳转表,golang 的switch 实现是通过二分法(v1.7.2)来实现的。所以有人测出在超多分支的情况下 , golang的 switch 比起mapif else 要慢 ,因为命中率太低了。而小分支的情况下,性能的差距是很小而基本可以忽略的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

func BenchmarkSwitch(b *testing.B) {
arra := []string{"a", "b", "c", "d"}
for i := 0; i < b.N; i++ {
rand.Seed(time.Now().Unix())
a := rand.Intn(3-0) + 0
switch arra[a] {
case "a":
print(arra[a])
case "b":
print(arra[a])
case "c":
print(arra[a])
case "d":
print(arra[a])
}
}
}
func BenchmarkIF(b *testing.B) {
arra := []string{"a", "b", "c", "d"}
for i := 0; i < b.N; i++ {

rand.Seed(time.Now().Unix())
a := rand.Intn(3-0) + 0
if arra[a] == "a" {
print(arra[a])
} else if arra[a] == "b" {
print(arra[a])
} else if arra[a] == "c" {
print(arra[a])
} else if arra[a] == "d" {
print(arra[a])
}
}
}

以下是测试结果

1
2
BenchmarkSwitch-8   	  200000	      7612 ns/op
BenchmarkIF-8 200000 7624 ns/op

可以看出来,小分支的情况下,性能和 if 比起来甚至会超过 if (Golang v1.12.6) 。

所以,在使用 golang 的过程中,如果不是极度需要考虑到性能的情况,为了代码的优雅,请多多使用switch !