今回は Hello, World!
と表示するだけの定番プログラムを通じて、プログラミングを始める方法と基本的な作業の流れについて学びます。
プログラムとコード
「プログラムが書かれたテキスト」を「ソースコード」とか「コード」と呼ぶことがあります。どれもだいたい同じ意味なので適宜読み替えてください。
プログラムを書く場所を作る
まずはプログラムを書く場所が必要です。新しいディレクトリを作りましょう。名前はなんでもいいですが、とりあえず hello
としてください。作成したら、VSCodeで開きます。
モジュールを初期化する
ディレクトリを開いたら、次はモジュールを初期化します。モジュールについてはいずれ説明するとして、ターミナルを開いて以下のコマンドを入力します。
go mod init hello
エクスプローラーに go.mod
というファイル(赤枠)が生成されていれば、モジュールの初期化は成功です。上手くいかない場合は、コマンドが間違っているか、Goのインストールに失敗しているか、あるいはカレントディレクトリがVSCodeで開いているものと別になってしまっているかもしれません。
プログラムを書く
さて、これでプログラムを書く場所ができました。次はファイルを作成します。方法はなんでもよいですが、ここではエクスプローラー上の何もない場所を右クリックし、「新しいファイル...」をクリックして作成することとします。
続いてファイル名の入力を求められるので、ここでは hello.go
と入力し、エンターキーで確定します。.go
の部分は拡張子と呼ばれ、ファイルの種類を表す大事なものです。拡張子を正しく入力すると、ファイルの左に添えられたアイコンも 三GO
的なロゴに変化します。
作成したファイルに以下のテキストを入力します。大変な場合はコピペしてしまっても構いません。また、例によって例のごとく、半角入力になっていることを確かめてください。
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
入力したら、「Ctrl+s」で保存します。これで初めてのプログラムが書けました!小さな一歩ですが、偉大な一歩です。
もし下の図のように赤い波線(ここでは {
の直前にある)が表示されている場合、その場所にエラーがあることを示しています。エラーの対処は後ほど説明するので、正しいプログラムが入力できているか再度確かめてください。
実行する
ではプログラムを実行します。以下のコマンドをターミナルに入力してください。
go run .
go run
はGoのプログラムを実行するためのコマンドで、.
はカレントディレクトリを意味します。合体することで、「カレントディレクトリのプログラムを実行せよ!」という意味になります。
実行後、ターミナルに Hello, World!
と出力されれば成功です。おめでとうございます!🎉
初めてのプログラムが動いた!
前回説明した通り、同じコマンドを何度も実行したいときは「上矢印からエンター」を活用しましょう。
編集する
無事実行できたら、今度は別の言葉を表示するようなプログラムに改変してみましょう。先程のプログラムを、このような内容で上書きします。
package main
import "fmt"
func main() {
fmt.Println("ハローワールド!")
}
変わったのは ハローワールド!
の部分ですね。
ターミナルで上矢印を押してまた go run .
を実行すると、ハローワールド!
と表示されるはずです。無事表示できたでしょうか。できたら、さらにいろんなメッセージを表示させてみましょう。
エラーに対処する
これから長い付き合いになるエラー。これは決してあなたを責めるものではありません。間違いの原因と直し方まで優しく教えてくれるので、学校の先生よりむしろ親切かもしれません。
VSCodeでエラーを見るには、
- 赤い波線が引かれた場所にマウスカーソルを当てて出てくる「ホバーウィンドウ」
- 最下段にある
✕ 1 ⚠ 0
的な部分をクリックして出せる「問題」タブ
などが利用できます。
ここでは expected '(', found '{'
と書いてありますが、これは 「(
が来るべきなのに {
が来ているよ」という意味です。実際、指示に従い main
の後ろに ()
を足すことで、この問題は修正できます。
英語なのが少し怖いと感じるかもしれませんが、慣れれば雰囲気である程度はわかることが多いです。難解なら、エラーの内容を丸ごとGoogleに貼り付けて検索すれば、解決策を書いてくれている人がいるはずです。
もしそれでも怖い、分からないという場合は、ChatGPTのようなAIを活用するとよいでしょう。エラーの内容とできればプログラムを貼り付けた上で質問し、それでも分からないところがあれば対話しながら少しずつエラーの原因を探ることができます。
エラーはあなたを責めるものではありません。エラーが出ないように悩むより、とりあえず曖昧な部分は書いてみて試し、エラーに教えてもらって正しいやり方を把握する方が効率が良いことも多いです。どんな熟練プログラマーになっても、人間である以上意図通りのプログラムを一発で完成させることは難しいため、エラーには大変お世話になります。(というか、熟練プログラマーにとっては「間違っているのにエラーで教えてくれない」方が怖いです。これ本当。)
ぜひ、エラーを恐れず、エラーを頼り、エラーを使いこなせるようになっていってください。
正しいはずなのになぜかエラーが消えない場合
そうはいってもたまにエラーチェックのバグか何かで、正しい記述をしているのにエラーが消えない場合があります。そういった場合はコマンドパレット(Ctrl+Shift+p)から Go: Restart Language Server
を選択すればだいたい治ります。逆に、これをしても治らない場合は何らかの問題を見落としている可能性が高いです。
基本の開発サイクル
というわけで、ここまでで基本的な開発サイクルを抑えることができました。この流れは今後も変わりません。
- まずディレクトリを用意する。
- モジュールを初期化する。
- ファイルを作る。
- 編集する。
- 実行する(ターミナルの「上矢印押してエンター」を活用する)。
- エラーが出たら、エラーを読んで修正する。
- 以下、編集と実行と修正を繰り返す。
このページのまとめ
- Goで新しいプログラムを作るには、ディレクトリを作り、モジュールを初期化する。
- 「コードを書く、
go run .
で実行する、修正する」が基本的な流れ。 - エラーは親切な先生であり、ありがたい存在。もしそれでも怖い場合は、AIを活用しよう。
詳しい解説
プログラムの構造
Goの構成要素を説明するにあたって今後もちょいちょい出てくる「宣言/declaration」という言葉ですが、これはざっくり言うと「作成する」とか「〇〇という名前のものとその内容がここあると示す」みたいなニュアンスです。ちょっと説明というか翻訳が難しいですね...。雰囲気だけで大丈夫です。
package main // パッケージ宣言
import "fmt" // インポート文
func main() { // 関数宣言
fmt.Println("Hello World!") // 関数呼び出し
}
package main
はこのプログラムが main
パッケージに属することを示しています。パッケージはプログラムを束ねる単位で、同じディレクトリにあるプログラムは基本同じパッケージに属します。
import "fmt"
はよそのパッケージの機能を取り込むためのインポート文です。fmt
パッケージは、画面にテキストを表示する Println
などの関数を提供しています。
func main() {
から }
までが main
関数の宣言です。関数とは何らかの処理のかたまりのことです。
main
パッケージの main
関数は特別な存在で、プログラムの起点を表します。試しにパッケージ名か関数名のどちらかを main
以外の適当な名前に変更すると、go run .
がエラーになって実行できないのが確認できるはずです。
いきなり新しい用語がたくさん登場しましたが、詳しくはのちのち説明するので、今は「こんなものがあるんだな」という程度で大丈夫です。
コメント
//
から行末まではプログラムとしては認識されないコメント(注釈)です。コメント内容には全角文字も使えます。あってもなくても実行には影響しないのですが、効果的に使うことで人間にとって読みやすいプログラムにすることができます。
/* */
で囲うと複数行のコメント(ブロックコメント)を書くことができます。//
と比べて使う機会は少ないですが、たまに使います。
コメントではない // 単一行のコメント
コメントではない
/*
複数行の
コメント
(ブロックコメント)
*/
// Goだとこのように
// 単一行のコメントを
// たくさん並べて
// 長いコメントを書くことのほうが
// 多い気がします
コメントは「プログラムには影響しない」という性質を活かして、「ドキュメント」や「ディレクティブ」として読み手への注釈だけでなくさまざまな目的にも利用されますが、そういったコメントの使い方は必要になったタイミングで適宜説明します。
プログラミングと英語
プログラムは大抵英語に似せてあるので、一見英語ができないとプログラミングができないように思われがちですが、筆者は全然そんなことはないと考えています。プログラミングに必要な考え方は英語の能力とは別なので、よくイメージされるほどの関係性はありません。
もちろん、英語を知っていれば英語圏の人とプログラムをやり取りしたり、英語でのみ書かれた説明書きを読みやすいなどはありますが、必須ではありません。昨今は翻訳AIも発達してきているので、尚更何とかなると筆者は考えています。