2013年11月26日火曜日

Golang Cafe #5を開催しました。

Golang Cafe #5を開催しました。

今回は、osパッケージを利用するのをテーマに進めました。
githubのリポジトリにもpush済みですので、ソースコードはそちらをご覧ください。

私が動作させた関数は以下です。

  • Open
  • Getenv
  • IsExist
  • IsNotExist
  • Chdir
  • Remove
  • RemoveAll
  • Mkdir
  • MkdirAll
  • Environ
まず、注意点として、パスを指定する時に"~"の指定はできないので、ホームディレクトリを取得する場合は、Getenv("HOME")で環境変数から取得して下さい。
ちなみに、"~"を使うと、カレントディレクトリに"~"というディレクトリができて困ることになります。

ディレクトリの存在チェック
os.Open()を使います。ディレクトリが存在しない場合は、戻り値にerrorが返されるので、直接errorを判定してもいいですが、IsExist()とIsNotExist()を呼ぶと、true/falseで存在チェックができるようになっているので、そちらを利用する方が便利です。

RemoveAllとRemove、MkdirAllとMkdirの違いですが、複数階層のディレクトリを指定する場合は、RemoveAll()、MkdirAll()を呼び出さないと、ディレクトリの作成、削除はできません。(errorが返されます)存在するディレクトリに新たにディレクトリを作る/削除する場合は、Mkdir()、Remove()でも実行できます。

Chdir()はカレントディレクトリを移動します。

Environ()は環境変数名の一覧を取得する関数です。Getenv()の引数もEnviron()で取得できる文字列を指定すれば、環境変数の設定を取得する事ができます。

それから、今回はWindowsでの動作が「サポートされていない」という状況が多かったのでWindowsで動作を検証していた+Takanobu Haginoさんは、ちょっとお困りのようでした。
Windowsにはuidなどの属性が存在しないのでGetuid()などを呼び出しても-1しか返ってきません。実装がreturn -1になっています。(syscallパッケージのソースコードに書かれています)(これはWindowsの仕組み上、どうしようもないと思われる)

osパッケージは内部でsyscallパッケージの関数を呼び出すようになっている事が多いので、syscallパッケージを触ってみる方が良いのかもしれません。

ということで、今回はあまり動かせなかったので、また今度osパッケージを使う(2回目)が行われることでしょう。

次回の#6はtemplateパッケージ(私は最近使わなくなってしまった…)の使い方がテーマになる予定です。