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ディレクトリを作成
mkdir hello

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

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

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

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

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

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

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

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

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

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

$ 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

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 のように MARKDOWN_HASHfad58de7366495db4650cfefac2fcd61MARKDOWNHASH という関数はコマンドラインのエントリポイントとなるルールなのでしょうか?このあたりはもう少し学習する必要があります。

作成した 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

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

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

今度は 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