条件选择
条件选择
if
if x > 0 {
return y
}
编写代码时,应尽量减少条件的嵌套深度。如方法返回错误时,应尽量提前结束。应当尽可能减少正常逻辑代码的嵌套深度,这有利于提高代码的可读性,便于快速分辨出哪些还是正常逻辑代码,例如:
这是一个不好的代码风格,正常逻辑代码被缩进在
if err != nil {
// error handling
} else {
// normal code
}
更好的写法:
if err != nil {
// error handling
return // or continue, etc.
}
// normal code
如果
if x, err := f(); err != nil {
// error handling
return
} else {
// use x
}
那么将初始化的短声明赋值语句单独写成一行:
x, err := f()
if err != nil {
// error handling
return
}
// use x
Switch
func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
return c - '0'
case 'a' <= c && c <= 'f':
return c - 'a' + 10
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
return 0
}
func shouldEscape(c byte) (b bool) {
switch c {
case ' ', '?', '&', '=', '#', '+':
fallthrough
case '%':
b = true
default:
b = false
}
return
}
尽管它们在
Loop:
for n := 0; n < len(src); n += size {
switch {
case src[n] < sizeOne:
if validateOnly {
break
}
size = 1
update(src[n])
case src[n] < sizeTwo:
if n+1 >= len(src) {
err = errShortInput
break Loop
}
if validateOnly {
break
}
size = 2
update(src[n] + src[n+1]<<shift)
}
}
当然,
// Compare 按字典顺序比较两个字节切片并返回一个整数。
// 若 a == b,则结果为零;若 a < b;则结果为 -1;若 a > b,则结果为 +1。
func Compare(a, b []byte) int {
for i := 0; i < len(a) && i < len(b); i++ {
switch {
case a[i] > b[i]:
return 1
case a[i] < b[i]:
return -1
}
}
switch {
case len(a) > len(b):
return 1
case len(a) < len(b):
return -1
}
return 0
}
类型选择
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T", t) // %T 输出 t 是什么类型
case bool:
fmt.Printf("boolean %t\n", t) // t 是 bool 类型
case int:
fmt.Printf("integer %d\n", t) // t 是 int 类型
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t 是 *bool 类型
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t 是 *int 类型
}