golang学习小结

142 阅读1分钟

#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)))