Golang Cafe #5 まとめ osパッケージを読む

2013/11/24に開催された「Golang Cafe #5」についてのまとめです。
今回はosパッケージを可能な限り動作を確認していきました。
他の参加者の方もまとめを書かれていますが、今回は思ったほど進みませんでした。
特にWindowsGolang 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に軍配が上がりそうです。


残りの関数、メソッドは個人的に動作確認しておこうと思います。