#1 defer
在循环体中的defer语句需要特别注意,因为只有在函数执行完毕后,这些被延迟的函数才会执行。下面的代码会导致系统的文件描述符耗尽,因为在所有文件都被处理之前,没有文件会被关闭。
for _, filename := range filenames {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // NOTE: risky; could run out of file
descriptors
// ...process f…
}
解决方案之一是将循环体中的defer语句移至另外一个函数。在每次循环时,调用这个函数。
for _, filename := range filenames {
if err := doFile(filename); err != nil {
return err
}
}
func doFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close()
// ...process f…
}
#2 判断系统位数
利用^uint(0) 在 32位系统 上返回的是 0XFFFFFFFF,也就是 2进制(11111111111111111111111111111111)
^uint(0) 在 64位系统 上返回的是 0xFFFFFFFFFFFFFFFF,也就是 2进制(1111111111111111111111111111111111111111111111111111111111111111)
- 方法一
bit := 32 << (^uint(0) >> 63)
fmt.Prinln(bit)
- 方法二
s := fmt.Sprintf("%b", ^uint(0))
log.Printf("Type(s)=%T,Len(%s)=%d\n", s, s, len([]byte(s)))