Go 最初のプログラム
この章では、最初の Go プログラムをステップバイステップで作成・理解し、実行していきます。これは単なる出力の練習ではなく、その後に続く複雑なコンセプトを探索するための強固な基礎を築くためのものです。
1. 最初の Go プログラムを作成する
それでは、さっそく手を動かして、あの有名なコードを書いてみましょう。
ステップ 1:新しいファイルの作成
コードエディタや IDE(前章で設定した VS Code など)を開き、hello.go という名前のファイルを新規作成します。.go という拡張子は非常に重要で、これが Go 言語のソースコードファイルであることを Go コンパイラに明示します。
ステップ 2:コードの記述
以下のコードを hello.go ファイルにそのまま入力してください。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}ステップ 3:ファイルの保存
ファイルを、後で見つけやすいディレクトリに保存します(もし GOPATH を設定している場合は、一旦 GOPATH/src ディレクトリ以外の独立したフォルダに保存してください)。正式なプロジェクト構造については、後ほど詳しく解説します。
2. コードの逐行解析:プログラムの心臓部
この数行の短いコードには、Go プログラムの最も核心となる骨組みが含まれています。一行ずつ解体してみましょう。
- package main: この行は、現在のコードが属するパッケージ (Package) を宣言しています。Go において、パッケージはコードを組織化し、再利用するための基本的な方法です。
mainパッケージは非常に特殊なパッケージで、すべての実行可能プログラムのエントリポイント(入口)となります。直接実行したい Go プログラムには、必ず main パッケージを含める必要があります。アプリケーションを起動するための「メインゲート」のようなものだと考えてください。 - import "fmt": この行は
fmtパッケージをインポート (Import) しています。importキーワードは外部パッケージを取り込むために使用され、これにより他の人が作成した既存の関数や型を利用できるようになります。fmt("format" の略)パッケージは、テキストのフォーマット出力や入力機能を提供します。C 言語のprintfや Java のSystem.out.printlnに似ています。 - func main() { ... }: ここでは main 関数 (Function) を定義しています。
mainパッケージ内において、main関数はプログラム起動時に最初に実行される関数です。すべての実行可能な Go プログラムは、mainパッケージ内に一つのmain関数を持つ必要があります。後ろの括弧()はこれが関数であることを示し、引数を受け取らないことを意味します。中括弧{}は、その関数が実行する具体的なロジックを囲みます。 - fmt.Println("Hello, World!"): これがプログラムのメインアクションです。
fmtパッケージ内のPrintln関数を呼び出しています。Println("Print Line" の略)は、一行のテキストをコンソール(標準出力)にプリントします。出力したいテキスト"Hello, World!"はダブルクォーテーションで囲まれており、これはプログラミングの世界で文字列リテラル (String Literal) と呼ばれます。
3. Go プログラムの実行
コードが書けたら、実際に動かしてみましょう!
- ターミナルまたはコマンドプロンプトを開く: コマンドラインツールを使用し、
cdコマンドでhello.goを保存したディレクトリに移動します。 - プログラムの実行:
go runコマンドを入力し、その後に Go のファイル名を指定します。
go run hello.goこのコマンドは、瞬時にコードをコンパイルし、そのまま実行します。ターミナルに以下のような出力が表示されるはずです。
Hello, World!おめでとうございます!最初の Go プログラムの実行に成功しました。
4. Go プログラム構造の深掘り:パッケージ、インポート、関数
さらに理解を深めるために、Go プログラムの 3 つの基本コンポーネントについて掘り下げていきましょう。
4.1 パッケージ (Packages)
- 用途: パッケージは、Go のコードを再利用可能なユニットに組織化するために使用されます。関連する関数、型、変数を一つにまとめます。これによりコードのモジュール化が進み、メンテナンスや理解が容易になります。
- main パッケージ: 先ほど述べた通り、プログラムの絶対的な入口です。
- その他のパッケージ: Go は非常に豊富な標準ライブラリ(組み込みパッケージ)を持っており、例えば
fmt、os(オペレーティングシステム機能)、net(ネットワーク)、httpなどがあります。また、自身のビジネスロジックを整理するために独自のパッケージを作成することもできます。 - 命名規則: パッケージ名は短く、簡潔に内容を表し、すべて小文字であるべきです。そのパッケージ内のコードの用途を直接反映する名前にします。
例: Web アプリを開発する場合、ユーザーログインを処理するパッケージ(package auth)、データベースを処理するパッケージ(package db)、ルーティングを処理するパッケージ(package router)などが考えられます。
4.2 インポート (Imports)
- 用途:
import文は外部パッケージをプログラムに引き込むために使用され、定義済みの機能を利用可能にします。 - 複数のパッケージを一度にインポート: 複数のパッケージを導入する必要がある場合、Go では円括弧を使用して一括インポートすることを推奨しています。これによりコードがスッキリします。
import (
"fmt"
"math"
)- インポートエイリアス: コード内でパッケージに短い名前を付けたい場合や、異なるパッケージ間で名前の衝突を避けるために、エイリアス(別名)を使用できます。
import (
f "fmt" // これで fmt.Println の代わりに f.Println を使えます
)4.3 関数 (Functions)
- 用途: 関数は特定のタスクを実行するコードのブロックであり、Go プログラムの基礎となるビルディングブロックです。
- 宣言方法:
funcキーワードを使用し、次に関数名、引数リスト(ある場合)、戻り値の型(ある場合)、最後に中括弧{}で囲まれた関数本体を記述します。
func add(x int, y int) int {
return x + y
}(このコードは add という名前の関数を定義しており、2 つの整数 x と y を受け取り、その和を返します。戻り値も整数です)
- 関数の呼び出し: 関数名に括弧
()を付けて実行します。関数が引数を必要とする場合は、対応する値を括弧の中に入れます。
result := add(5, 3) // add 関数を呼び出し、引数 5 と 3 を渡す
fmt.Println(result) // 結果 (8) をプリントする5. Go の強力なサポーター:go run コマンド
go run は、日常の開発において Go プログラムを素早くコンパイルして実行するための強力なツールです。
- コンパイルと実行の統合:
go runは実際、内部で 2 つのステップを実行しています。まず Go のソースコードを実行可能なバイナリファイルにコンパイルし、その後すぐにそのバイナリファイルを実行します。 - 一時ファイル: 生成されたバイナリファイルは通常、一時ディレクトリに隠されており、プログラムの実行が終了すると自動的に破棄されます。そのため、ワークスペースを汚すことなく、クイックテストや実験を行うのに最適です。
- 複数のファイルの実行: 一度に複数のファイルを
go runに渡すことができます。
go run main.go helper.goGo は自動的にそれらをまとめてコンパイルします。ファイルの順番は関係ありません。
- 依存関係の自動解決: 他のパッケージをインポートしている場合、
go runは非常にスマートで、それらの依存パッケージを自動的に見つけてコンパイルします。 - 使用シーン: 開発段階では、コードの修正を検証するために
go runを積極的に活用してください。最終的にプログラムをサーバーにデプロイする段階になって初めて、恒久的な実行ファイルを生成するために go build を使用することになります。