Goは、静的型付けのコンパイル言語です。この演習では、パッケージ、関数、変数という3つの主要な言語機能を紹介します。
Goのアプリケーションは、パッケージという単位で構成されます。パッケージとは、同じディレクトリにあるソースファイルをまとめたものです。同じディレクトリにあるソースファイルは、すべて同じパッケージ名でなければなりません。パッケージをインポートしたとき、名前が大文字で始まるもの(関数、型、変数、定数)だけが使用・アクセスできます。Goで推奨される命名スタイルでは、識別子はcamelCaseで命名します。ただし、パッケージをまたいでアクセスできるようにするものはPascalCaseにします。
package lasagna
Goは静的型付けであり、すべての変数はコンパイル時に型が定義されている必要があります。
変数は、型を明示的に指定して定義できます。
var explicit int // Explicitly typed
初期化子を使うこともできます。その場合、コンパイラーが初期化子の型に合わせて変数の型を割り当てます。
implicit := 10 // Implicitly typed as an int
一度宣言した変数には、=演算子を使って値を代入できます。一度宣言すると、変数の型を変更することはできません。
count := 1 // Assign initial value
count = 2 // Update to new value
count = false // This throws a compiler error due to assigning a non `int` type
定数は変数と同じようにデータを保持しますが、プログラムの実行中にその値を変更することはできません。
定数はconstキーワードを使って定義し、数値、文字、文字列、真偽値のいずれかにできます。
const Age = 21 // Defines a numeric constant 'Age' with the value of 21
Goの関数は、0個以上の仮引数を受け取ります。仮引数は明示的に型を指定する必要があり、型推論はありません。
値はreturnキーワードを使って関数から返されます。
関数は、関数名を指定し、その関数の各仮引数に引数を渡すことで呼び出します。
Goでは2種類のコメントが使えることに注意してください。1行コメントは//で始め、複数行コメントは/*と*/の間に書きます。
package greeting
// Hello is a public function.
func Hello (name string) string {
return hi(name)
}
// hi is a private function.
func hi (name string) string {
return "hi " + name
}
この演習では、お気に入りの料理本のラザニアをすばらしい出来に仕上げるために、コードを書いていきます。
タスクは4つあり、どれもラザニアの調理にかかる時間に関するものです。
ラザニアをオーブンに入れておくべき分数を表すOvenTime定数を定義します。料理本によると、想定されるオーブンの加熱時間は40分です。
OvenTime
// => 40
RemainingOvenTime()関数を定義します。この関数は、ラザニアを実際にオーブンに入れておいた分数を入力として受け取り、前のタスクで求めた想定加熱時間をもとに、ラザニアをあと何分オーブンに入れておく必要があるかを返します。
func RemainingOvenTime(actual int) int {
// TODO
}
RemainingOvenTime(30)
// => 10
PreparationTime関数を定義します。この関数は、ラザニアに重ねた層の数を入力として受け取り、ラザニアの準備にかかった分数を返します。1層につき2分かかるものとします。
func PreparationTime(numberOfLayers int) int {
// TODO
}
PreparationTime(2)
// => 4
ElapsedTime関数を定義します。この関数は2つの入力を受け取ります。1つ目はラザニアに重ねた層の数、2つ目はラザニアをオーブンに入れておいた分数です。
この関数は、ラザニアの調理に合計で何分かかったかを返します。これは、準備にかかった分数と、その時点でラザニアがオーブンにいた分数を足したものです。
func ElapsedTime(numberOfLayers, actualMinutesInOven int) int {
// TODO
}
ElapsedTime(3, 20)
// => 26