2.1 こんにちは、Go
アプリケーションを書き始める前に、まず基本となるプログラムから始めます。家を建てようとする前に建物の基礎がどういったものかわからないのと同じように、プログラムの編集もどのように始めたらよいのかわからないものです。そのため、本章では、最も基本的な文法を学習し、Goプログラムを実行してみます。
プログラム
これは伝統なのですが、大部分の言語を学習するときは、どのようにしてhello world
を出力するかというプログラムを書くことを学びます。
用意はいいですか?Let's Go!
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい\n")
}
以下のように出力されます:
Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい
説明
まず我々はある概念を理解する必要があります。Goプログラムはpackage
で構成されています。
package <pkgName>
(我々の例ではpackage main
)の1行は現在のファイルがどのパッケージの属しているかを表しています。またパッケージmain
はこれが独立して実行できるパッケージであることを示しています。コンパイル後実行可能ファイルが生成されます。main
パッケージを除いて、他のパッケージは最後には*.a
というファイルが生成され(パッケージファイルとも呼ばれます。)、$GOPATH/pkg/$GOOS_$GOARCH
に出力されます。(Macでは$GOPATH/pkg/darwin_amd64
になります。)
それぞれの独立して実行できるGoプログラムは必ず
package main
の中に含まれます。このmain
パッケージには必ずインターフェースとなるmain
関数が含まれます。この関数には引数がなく、戻り値もありません。
Hello, world...
と出力するために、我々はPrintf
関数を用います。この関数はfmt
パッケージに含まれるため、我々は3行目でシステム固有のfmt
パッケージを導入しています:import "fmt"
。
パッケージの概念はPythonのpackageに似ています。これらには特別な利点があります:モジュール化(あなたのプログラムを複数のモジュールに分けることができます)と再利用性(各モジュールはすべて他のアプリケーションプログラムで再利用することができます)。ここではパッケージの概念を理解するにとどめ、あとで自分のパッケージを書くことにしましょう。
5行目では、キーワードfunc
を通じてmain
関数を定義しています。関数の中身は{}
(大括弧)の中に書かれます。我々が普段CやC++、Javaを書くのと同じです。
main
関数にはなんの引数もありません。あとでどのように引数があったり、0個または複数の値を返す関数を書くか学ぶことにしましょう。
6行目では、fmt
パッケージに定義されたPrintf
関数をコールします。この関数は<pkgName>.<funcName>
の形式でコールされます。この点はPythonとよく似ています。
上述の通り、パッケージ名とパッケージが存在するディレクトリは異なっていてもかまいません。ここでは
<pkgName>
がディレクトリ名ではなくpackage <pkgName>
で宣言されるパッケージ名とします。
最後に、我々が出力した内容に多くの非ASCIIコードが含まれていることにお気づきかもしれません。実際、Goは生まれながらにしてUTF-8をサポートしており、いかなる文字コードも直接出力することができます。UTF-8の中の任意のコードポイントを識別子にしても構いません。
結論
Goはpackage
(Pythonのモジュールに似ています)を使用してコードを構成します。main.main()
関数(この関数は主にメインパッケージにあります)は個別に独立した実行可能プログラムのインターフェースになります。GoはUTF-8文字列と識別子(なぜならUTF-8の発明者もGoの発明者と同じだからです。)を使用しますので、はじめから多言語サポートを有しています。