如果你想創(chuàng)建一個目錄并授予777權(quán)限,你需要怎么做?查看Go的API文檔我們可以這樣寫。
源文件為mkdir.go。
package main
import (
"fmt"
"os"
)
func main() {
err := os.MkdirAll("/tmp/gotest/", 0777)
if err != nil {
panic(err)
}
fmt.Println("Mkdir /tmp/gotest/")
}
? understand_linux_process_examples git:(master) ? ll /tmp/
drwxr-xr-x 2 tobe wheel 68B Dec 30 10:06 gotest
? understand_linux_process_examples git:(master) ? umask
022
代碼在mkdir_umask.go中。
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
mask := syscall.Umask(0)
defer syscall.Umask(mask)
err := os.MkdirAll("/tmp/gotest/", 0777)
if err != nil {
panic(err)
}
fmt.Println("Mkdir /tmp/gotest/")
}
這并不是Go的Bug,包括Linux系統(tǒng)調(diào)用都是這樣的,創(chuàng)建目錄除了給定的權(quán)限還要加上系統(tǒng)的Umask,Go也是如實遵循這種約定。
如果你想達(dá)到你的預(yù)期權(quán)限,知道Umask及其用法是必須的。