Go言語で “Hello, World” プログラムをコーディングしてみる

前回のエントリGo 言語 の実行・開発環境をセットアップできました。

いよいよコーディングしてみます。

今回は 公式ページのチュートリアル を参考にして、実際にソースコードを書きながら Go 言語 の学習を進めていこうと思います。

今回のエントリで学ぶことをさっくり箇条書き

チュートリアルで網羅しているのは以下の内容になります。

  • いくつかのシンプルな "Hello, World" コード
  • 作成したコードを実行するための go コマンドの使い方
  • 作成したコードの中で使っているパッケージを検索するための 言語パッケージ検索ツール の使い方
  • 外部モジュールで提供されている関数の呼び出し方法

前提条件・推奨条件

Go 言語 のチュートリアルを進めるにあたって、以下の事項が推奨されています。

  1. Go 言語 以外のプログラミング経験
    • チュートリアルで記述することは非常にシンプルですが、いくつかの関数は C 言語や Java など他のプログラミング言語と同様の機能が登場します。
    • 他のプログラミング言語経験したことがあれば理解が容易になります。
  2. 使い慣れたテキストエディタ
    • 多くの適正化が Go 言語 をサポートしています。 ( 例 : VSCode、 GoLand、 Vim )
  3. 使い慣れたターミナル.
    • 使い慣れたターミナルを使いましょう。
    • Linux macOS であれば標準の Terminal を使うことも出来ます。 Windows であれば PowerShell や cmd を利用できます。

ちなみに、僕は iTerm + Vimmer を使います

コーディング開始!

それではいよいよ、コーディングを進めていきます。

1. ターミナルを開きます

2. ターミナルに以下のように入力します

ホームディレクトリに移動しましょう。

$ cd

Windows OS の場合には以下のコマンドを入力します。

% cd %HOMEPATH%

3. ソースコード配置ディレクトリを作成し、移動します。

hello というディレクトリを新規に作成し、移動します。

# helloディレクトリを作成
mkdir hello

# 作成したディレクトリに移動
cd hello

4. 作成中のコードが依存しているモジュールをトラッキングさせる

いよいよわからない単語や文章が出てきました

PHP における composer.jsonRuby における Gemfile のようなものだと思いますが、
Go 言語 では go.mod というファイルにソースコード内で利用するモジュールを記述します。

go.mod ファイルは、 ソースコードと一緒に Github のような ソースコードリポジトリに含めておく必要があります。

go.mod ファイルを作成するには go mod init コマンドを実行します。
go.mod ファイルが作成されて初めて、利用する外部モジュールのトラッキングが有効となります。

go mod init コマンドの末尾には 引数 が必要です。
引数 は作成しようとしてるモジュールの名前を指定しますが、 他のアプリケーションで利用されていないようなユニークなものを指定する必要があります。

「どうしたら他のアプリケーションと重複せずにユニークになるか?」 と考えだすと難しいのですが、
「Github リポジトリを作る際のリポジトリ名を指定するものだ」 と思ってもらえばにユニークになるはずです。

僕の場合だと genzouw/hello というのが今回は良さそうです ( genzouw は僕の SNS 名 ) 。

では依存モジュールのトラッキングを有効にしていきましょう。
以下のコマンドを実行します。

$ go mod init genzouw/hello
go: creating new go.mod: module genzouw/hello

コマンドの実行が終わると、 go.mod ファイルが作成されているはずです。

$ ls go.mod
go.mod

# catコマンドでファイルの中身を確認してみる
$ cat go.mod
module genzouw/hello

go 1.16

まだ依存するモジュールを利用していないため、今回作成するモジュール ( 一旦アプリケーションだと思ってもらえれば ) と利用するには Go 言語のバージョンしか記載されていません。

5. ソースコードの作成

ソースコードの作成に入ります。
使い慣れたテキストエディタで hello.go というテキストファイルを作成します。

以下のソースコードを貼り付けて保存しましょう。

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

ソースコードを簡単に解説してみます。

  1. main パッケージを宣言。パッケージというのは関数の詰め合わせのことということです。
  2. ここでは main パッケージの中に関数を一つ詰め込んでいる状態となっています。
    • ちなみに公式ドキュメントを見る限りだと同じパッケージを使ったコードは必ず同じフォルダに格納しなければならないようです
  3. fmt パッケージパッケージをインポートします。
    • fmt パッケージの中に入っている関数は、「文字列を加工」したり「標準出力に出力」するためのものがあります。
    • 文字列加工のためということなので、頻繁にお世話になるになる関数と想像できます。
    • fmt パッケージは Go をインストールした際に内包されている 標準ライブラリ と呼ばれるものの一つです。
    • Go 言語 をインストールした全環境で利用できます。
    1. 関数を実装しています。main 関数は、今回作成した main パッケージをコマンドラインから実行した時に自動的に呼び出される関数です。
      • Java のように main という関数はコマンドラインのエントリポイントとなるルールなのでしょう 。

作成した Go 言語のスクリプトを実行してみる

作成した Go 言語 のプログラムを実行してみましょう。
以下のコマンドを実行します。

$ go run .
Hello, World!

正常に実行できました!初めての "Hello, World" です!新しいプログラミング言語を学ぶときに通るいつものステップですが嬉しいですね。

他のプログラム言語では、実行コマンド( java / php / ruby / python )にスクリプトファイルを指定することが多いですが、
Go 言語 では スクリプトファイルの置かれているディレクトリを指定する ようですね。

いろいろ試してみたくなる性分なので、チュートリアルから脱線して試してみる

go コマンドに ディレクトリ ではなく ファイル を指定したらどうなる?

試しに go コマンドにファイルを指定したらどうなるのだろう?と思って指定してみたところ、問題なく動作しました。

$ go run hello.go
Hello, World!

ディレクトリ を指定しても スクリプトファイル を指定しても、どちらでも良いみたいですね。

同じディレクトリにもう 1 ファイル、main 関数を持つスクリプトを作ったらどうなる?

今度は hello2.go というファイルを作成してみました。

package main

import "fmt"

func main() {
    fmt.Println("Hello, World2!")
}

ほぼ一緒ですね。メッセージだけ変えておきました。

実行してみます。

$ go run .
# genzouw/hello
./hello2.go:5:6: main redeclared in this block
        previous declaration at ./hello.go:5:6

なるほど!同一パッケージ ( 「ブロック」と書かれてはいますが、パッケージも「ブロック」の 1 つということ? ) には、同じ名前の関数は複数作れないようです。

同じディレクトリに別パッケージのファイルを配置したらどうなる?

今度は hello2.go の関数名を main2 にして、パッケージ名も main2 にしてみます。

package main2

import "fmt"

func main2() {
    fmt.Println("Hello, World2!")
}

ほぼ一緒ですね。メッセージだけ変えておきました。

実行してみます。

$ go run .
found packages main (hello.go) and main2 (hello2.go) in /workdir

同じディレクトリに別の名前のパッケージは配置してはいけません。

go run コマンドだけじゃない、 go のサブコマンドたち

go run は複数用意されている go サブコマンドの一つです。
他のサブコマンドを表示したい場合には、以下のコマンドを実行します。

$ go help
Go is a tool for managing Go source code.

Usage:

        go <command> [arguments]

The commands are:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         add dependencies to current module and install them
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

ひとこと

今日はここまでにしておきます。

Goパッケージ の概念が少しわかりました。

わかってくると楽しいですね。

次回は 「外部パッケージ」を呼び出してみます
きっとこれができるようになれば、できることの幅が一気に広がるはずです。

Posted by genzouw