Golang Cafe
広告:第24回勉強会@岡山 - GDGChugoku よろしくね。
毎週日曜日に開催されているGolang Cafeに参加しました。このペースでの勉強会は全国でもめずらしいのではないでしょうか。場所は、青江の倉式珈琲店です。
本日は、How to Write Go Codeを、最初からやりました。ノートPCにLinuxMintとgolangだけでいったのに、みなさまありがとうございます。では、今日やったこと。
- まず、Workspaceをつくります。
% mkdir $HOME/golang (ここがWorkspaceになります)
その下にsrcディレクトリを作ります。
bin … 実行ファイルが格納されます
pkg … ライブラリファイルが格納されます
src … ソースコードが格納されます
今時は、https://github.com/username にリポジトリもってて、世界に向かってコードを公開してブイブイいわすのが普通なので(笑)
src/github.com/username/ までディレクトリを作ります。
- 次に、Workspaceを示す環境変数 GOPATH を設定します。.bashrc(または.cshrc)に書いておきます。
export GOPATH=$HOME/golang(または setenv GOPATH $HOME/golang)
- 最初のプログラムを書きます。
src/github.com/username/パッケージ名/ となります。ここでは、
「Hello, world.」を出力するプログラムを書きます。完全な写経です。
- go install を実行します
エラーがなければ、binディレクトリの下に、hello という実行形式のファイルが作成されました。実行すると「Hello, world.」と表示。成功です!!
- ライブラリの作成
平方根を計算するライブラリをsrc/github.com/username/newmathの下に sqrt.go を書きます。同じディレクトリで、go build を実行します。
$GOPATH/pkg/(OS名)/github.com/username/newmath/sqrt.a
が、作成されます。
さきほどのプログラムを一部変更して、newmath.Sqrtを呼びます。
func main() { fmt.Printf("Hello, world. Sqrt(2) = %v\n", newmath.Sqrt(2)) }
実行すると、「Hello, world. Sqrt(2) = 1.414213562373095」と表示。成功!
※ここで、ライブラリのMethodを呼ぶときは、最初の文字は必ず大文字にすること。仕様です。 fmt.Pintln newmath.Sqrt
ちょっと休憩。
- 自動整形ツール
軽めの話題で、自動整形ツール。ソースコードのインデントをそろえたり、importライブラリの順番を入れ替えたりしてくれます。
% go fmt
と入力すると、そのディレクトリにあるソースコードを整形してくれます。(実体は、gofmt -lw です。gofmtのオプションは調べて下さい)
- お楽しみのテストです
自分の作ったライブラリをテストするテストコードを書きます。Golangの組み込みのtestingパッケージを使います。
package newmath import "testing" func TestSqrt(t *testing.T) { const in, out = 4, 2 if x := Sqrt(in); x != out { t.Errorf("Sqrt(%v) = %v, want %v", in, x, out) } }
- Testのあとに関数名を書く
- t.Errorf()がエラー表示関数
% go test
を入力する。
成功した場合、「ok github.com/username/newmath 0.123s」
失敗した場合、「--- FAIL: TestSqrt (0.00seconds)」
と表示する。
世の中、テストファーストなどということもあるわけで、
const in, out = 9, 3
const in, out = 5, 2
などといろいろかえてみるのもいいと思います。
昨日は、話題のアニメ、カゲプロがはじまったらしいので、よくわかりませんが、貼っておきます。
PS.
for文は条件をそのあとに書くものでしょう。
if文も条件を書くものでしょう。
golangにおけるローカル変数初期化代入機能:= があるために、
sum :=0; for i:=1; i < 1000; i++ { sum += i }
という表現が可能になる。
if x:= f(y); x != 0 { return y / x }
if文の表現が簡潔になる。