Go言語 ~基礎編~ パッケージ

go

今回は、Go言語のパッケージについて学びます。

B男
B男

パッケージって何?卵を包むやつ?

はい、私のイメージもB男君と同じです。

Go言語では関連し合うGoファイルを「一箇所に組織立って」格納する方法があります。それが、パッケージです。

KOUKI
KOUKI

言っている意味がわかりませんよね?大丈夫です。これから学んでいきましょう。

学習履歴

パッケージ化が必要な理由

まず、次のコードを見てください。

このコードは、getNumberの戻り値を受け取って、おみくじを引いています。ユーザーがターミナルから打ち込んだ文字は、例え数字であっても文字列として見なされます。そのため、Atoi関数で文字列を数値に変換しているわけです。

KOUKI
KOUKI

このgetNumber関数は、他の関数でも利用できる気がしませんか?

例えば、以下のプログラムも実装できそうです。

同じ様な処理ですが、使用用途が違いますよね?

二つのサンプルコードに共通して使用されているgetNumberは、共通関数としてくくりだせそうです

サンプルを見てわかるように、パッケージに所属させる場合は、ソースファイルの先頭に「pcakge <フォルダ名>」と宣言します。

また、前に学習しましたが、関数の先頭を大文字(GetNumber)にすることで、外部ファイルからの読み込みが可能になります。

外部ファイルの関数を呼び出すときは、「パッケージ名.関数名」で呼び出すことができます。上記のサンプルは、otenki.goのコードを流用したものです。

今回の例では、getNumber関数一つだけであるため、パッケージ化の利点をあまり感じないかもしれません。しかし、扱うソースファイルが増えていくほどパッケージの利便性を感じられるようになるでしょう。

Go Workspace

Go言語は、Workspaceと呼ばれる特別なディレクトリからソースファイルの存在をチェックします。このWorkSpaceは、私たちのPCにGo言語をインストールした時に作成されます。

デフォルトだとユーザーのホームディレクトリ配下の「goディレクトリ」がWorkspaceになるかと思います。

Workspaceには、基本的に3つのサブディレクトリが格納されています。

  
サブディレクトリ名用途
binコンパイル済みのバイナリファイルを格納する
pkgコンパイル済みのパッケージファイルを格納する
srcGoのソースファイルを格納する

srcディレクトリには、更にサブディレクトリを配置していくことで、パッケージ化させていくわけですが、慣習的にサブディレクトリ名とパッケージ名は同一の名前にします。

パッケージ名について

KOUKI
KOUKI

パッケージにも命名規則があります。

・ 小文字で名付ける
・ 意味が捉えやすい省略形を用いる(例、format -> fmt)
・ 可能な限り、1単語で名付ける
・ アンダースコアや 大文字小文字が混ざった名前にはしない
・ 2単語以上の場合は、わかりやすい省略形を用いて1単語にする(string conversion -> strconv)
・ 開発者がローカル変数として宣言しそうな名前は避ける(名前衝突を防ぐため)

Constキーワード

Go言語も定数を定義できる言語です。その際は、次の通り「const」 キーワードを使って宣言します。

ほとんどが、変数の宣言と同じですが、異なる点もあります。

・ varキーワードの代わりに、constキーワードを用いる
・ 一度格納した値は、変更することができない
・ Short Variable Declaration(:=)が使えない

type(intなど)の指定は省略することも可能です。この場合は、Go言語が型を推論します。

また、一度格納した値は変更することができません。

constも先頭大文字で宣言すると外部ファイルからの読み込みが可能になります。

go installコマンド

「go install」コマンドを使うとプログラムを実行形式のバイナリファイルにしてワークスペース内のbinファイルに保存してくれます。

このコマンドは、srcディレクトリ内の実行ファイル(package mainから始まるファイル)が格納されているサブディレクトリに対して実行します。

KOUKI
KOUKI

実際に試してみましょう。

まずは、以下の構成のフォルダとファイルを用意します。※環境によっては、srcディレクトリ配下にgithub.comフォルダなどがあると思いますが、適宜読み替えて作業してください

簡単なプログラムですね。この構成の場合、実行ファイルは、personディレクトリのmain.goになります。

それでは、go installコマンドを実行しましょう。

go installコマンドの実行に成功するとbinディレクトリの中にpersonの実行ファイルが生成されます。

このファイルを実行してみましょう。

GOPATH

GOPAHを設定するWorkSpaceを変更できます。

GOPAHは、環境変数です。goコマンド実行時に、GoによりWorkSpaceの場所を特定する時などに使用されます。

最近のGoバージョンでは、GOPATHの設定は不要なのですが、前述の通り、WorkSpaceの場所を変更したいときなどは、この環境変数を変更してください。

KOUKI
KOUKI

とはいえ、言葉だけではわからないと思いますので、サンプルをお見せします。まずは、GOPATH設定前です。

デスクトップ上にディレクトリを作成して、Goのサンプルコードを格納しました。それでは、実行してみましょう。

greetingパッケージへのパスが見つからない旨のエラーが出ましたね。

デフォルトのパス以外の場所にコードを格納し、実行した場合は、上記のエラーが発生してしまいます。

それでは、GOPATHを変更してみましょう。

Macの場合は、terminal上からGOPATHを変更できます。

ちなみに、この設定変更は「実行したターミナル上でのみ有効」となります。設定を恒久的にしたい場合は、.bashrcなどに書き込むといいと思います。

ちなみに、Windowsの場合では、setコマンドを使います。

GOPATHを設定できたらもう一度、プログラムを実行してみましょう。

KOUKI
KOUKI

WorkSpaceを変更したい場合は、GOAPHで設定する。覚えましたでしょうか?

go getコマンド

go getコマンドについて、少しだけ紹介しておきます。

go getコマンドは、Goの外部ライブラリをインストールする時に使用します。

例えば、「https://github.com/headfirstgo/greeting」をインストールしたい場合は、terminal上から次の様に実行します。

ちなみに、gitをインストールしていないとコマンド実行時にエラーになるかもしれないので、そこだけは注意してください。※未検証

go doc コマンド

パッケージがGo言語にとって大切なのは分かったけど、開発が進むに連れて「このパッケージってなんだっけ?」ってなりそう。

B男
B男

はい、現場でもそういったケースは頻繁に起こりますw

私は、3日前に自分で書いたコードの意味がわからなくなることがあり、病気かな?と心配していた時期がありました。しかし、周りのエンジニアもだいたいそんな感じだったので安心した記憶があります。

KOUKI
KOUKI

自分で書いたコードすら意味がわからなくなる。パッケージも然り」ですね。

対処方法の一つは、「go docコマンドの活用」になります。

go docコマンドを実行するとパッケージや関数のドキュメントを取得することができるのです。

論より証拠。実際に取得してみましょう。

パッケージのドキュメントが取得できましたね。次は、関数のドキュメントです。

KOUKI
KOUKI

まぁ、ドキュメントは英語なので、英語力がないと相当厳しいのですが(苦笑)

よかったらこちらもどうぞ。下の記事は、ITエンジニアの英語力の必要性について個人的な見解を述べています。

もちろん、自作のパッケージや関数のドキュメントも取得できます。

やり方は簡単で、単純に「doc コメントを追加する」だけになります。

上記の例では、”簡単な”ドキュメントを書きましたが、実際の開発現場では詳細なコメントの方がいいでしょうね。

<良いコメント>
・ コメントは、完全な文章でなければならない
・ パッケージのコメントは、Package <package nam>から始めるべき
// Package personal enables widget management.
・ 関数コメントは、関数名から始めるべき
// MyFunction converts widgets to gizmos.
・ コメントには、サンプルコードを載せるのもあり(インデント付きで)

私の様に「コマンドラインからでは、ドキュメントが見にくい」という方は、公式サイトからドキュメントを参照してください。

あとは、全く使わないのですが、次の方法でもドキュメントを読むことができます。

localhost:6060にアクセスしてみます。

全く使わないのですがね

まとめ

KOUKI
KOUKI

今回、学んだことをまとめておきます。

まとめ

・ GoのWorkSpaceは、ホームディレクトリ配下のgoディレクトリ
・ GOPATHを設定することで、任意の場所をWorkSpaceにすることができる
・ WorkSpace内には、bin、src、pkgディレクトリが存在する
  – bin ・・・ コンパイル済みの実行ファイルを格納
  – src ・・・ Goのソースファイルを格納
  – pkg ・・・ コンパイルしたパッケージコードを格納
・ パッケージ名は全て小文字で、なるべく一単語になるように命名する
・ パッケージ外から関数を呼び出したい場合は、関数名の先頭を大文字にする
・ constに一度値を格納したら、値の変更は不可
・ go installコマンドは、Goのソースコードをコンパイルし、bin及びpkgにそれぞれコンパルしたファイルを格納する
・go getコマンドで、外部パッケージをローカルにインストールする
・go doc コマンドで、パッケージ及び関数のドキュメントを取得できる

参考書籍

次回

次回は、Arrayについて学びます^^

コメントを残す