Golang Cafe #5 まとめ osパッケージを読む
2013/11/24に開催された「Golang Cafe #5」についてのまとめです。
今回はosパッケージを可能な限り動作を確認していきました。
他の参加者の方もまとめを書かれていますが、今回は思ったほど進みませんでした。
特にWindowsでGolang Cafeに挑む私はかなりの苦戦を強いられました。
動作を確認できたのは以下の関数です。
- Chdir
- Chmod
- Chtimes
- Getegid
- Geteuid
- Getgid
- Getuid
- Getwd
なぜ2時間かけてこれだけたっだかというと、そこにはWindowsへの罠が仕掛けてあったからです。
Chown関数を試すには、uid、gidが必要なので、これらを取得する関数を試そうと思ったところ、いずれも-1が返ってきました。関連しそうな他の関数を試してみてもいずれも戻り値は-1。
+TakashiYokoyama氏や+Ryuji Iwata氏に相談しソースコードを掘っていったところsyscall_windows.goに辿り着きました。
osパッケージの関数の幾つかは内部でsyscallパッケージを使用しているようです。
しかしそこには非常に残念なコメントと実装がありました。
// TODO(brainman): fix all needed for os func Getppid() (ppid int) { return -1 } func Fchdir(fd Handle) (err error) { return EWINDOWS } func Link(oldpath, newpath string) (err error) { return EWINDOWS } func Symlink(path, link string) (err error) { return EWINDOWS } func Readlink(path string, buf []byte) (n int, err error) { return 0, EWINDOWS } func Fchmod(fd Handle, mode uint32) (err error) { return EWINDOWS } func Chown(path string, uid int, gid int) (err error) { return EWINDOWS } func Lchown(path string, uid int, gid int) (err error) { return EWINDOWS } func Fchown(fd Handle, uid int, gid int) (err error) { return EWINDOWS } func Getuid() (uid int) { return -1 } func Geteuid() (euid int) { return -1 } func Getgid() (gid int) { return -1 } func Getegid() (egid int) { return -1 } func Getgroups() (gids []int, err error) { return nil, EWINDOWS }
要は現バージョン1.1.2では上記の関数はWindowsには対応していないということです。
他にもWindowsには未対応な部分が少なからずありそうです。
このことはパッケージドキュメントにも記載されておらずソースコードを読んで初めて気づきます。なんとなく感覚で怪しいなとは思いますが、、、。
かなり時間のロスが大きいように思います。
Go言語を純粋に学ぶのならMac OSに軍配が上がりそうです。
残りの関数、メソッドは個人的に動作確認しておこうと思います。