【備忘】Go 言語のビルドと実行（３パターン）

Go 言語（Golang）の[ビルド（コンパイル）](https://wa3.i-3-i.info/diff502programming.html)から実行までの手順です。
次の３パターンにつき、メモとして残しておきます。

[1. ファイル１つで実行](#1-ファイル１つで実行)
[2. ファイル２つで実行（同一パッケージ）](#2-ファイル２つで実行同一パッケージ)
[3. 複数のパッケージで実行](#3-複数のパッケージで実行)

● 実行した環境
Go version : 1.17
OS : Windows10

## 1. ファイル１つで実行

まず、単純に一つの main ファイルから実行する場合です。

### 1-1. フォルダとファイルの作成

まず、「フォルダ」と「Go のファイル」を１つ作ります。
フォルダの場所やファイル名は何でも構いません。
ここでは `C:\golang\sample` というディレクトリに、`foo.go` というファイルを作ります。

```
sample
└──foo.go
```

### 1-2. ソースコードの記載

`foo.go` ファイルに次のソースコードを書きます。

```foo.go
package main

import "fmt"

func main() {
	fmt.Println("Hello world!")
}
```
`fmt` というライブラリをインポートして、`Plintln` メソッドで、文字列を出力するだけのものです。

なお、package名は **main**、関数名も **main** とする必要があります。
Go を実行すると、main パッケージの main 関数から処理が実行されることになります。

### 1-3. プログラムの実行（Modules を使用しない）

Go はコンパイル言語なので、先にビルド（コンパイル）して実行用のファイルを作成する必要があります。

**① go run コマンド**
まず、「ビルド」と「実行」を同時に行う方法です。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go run foo.go
Hello world!
```
作成したフォルダにディレクトリを移動した上で、`go run ファイル名` という形でコマンドを打ちます。
処理が実行され「Hello world!」と表示されます。
このコマンドでは、実行ファイルも残らないので、表見上、インタプリタ言語のように実行できます。

**② go build コマンド**
次の形が、多分、一般的だと思います。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go build foo.go

C:\golang\sample>.\foo
Hello world!
```

`go build ファイル名` というコマンドで、実行ファイルを作成します。
`foo.go` というファイルであれば、`foo.exe` という実行ファイルができます。

生成された実行ファイルは、`.\foo` というコマンドで実行できます（拡張子を除いたファイル名を使用）。
IDE などを使うと、`./foo` でも動いたりします。

### 1-4. プログラムの実行（Modules を使用する）

Go言語の依存モジュール管理ツールである [Modules](https://qiita.com/uchiko/items/64fb3020dd64cf211d4e) というものを使用すると、より簡易にプログラムの実行ができます。

**① go.mod の生成**
次のように、`go mod init モジュール名` と打てば、Modules を使用するために必要な `go.mod` ファイルが生成されます。
指定するモジュール名は何でも構いませんが、ここでは、フォルダ名 `sample` を指定しておきます。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go mod init sample
go: creating new go.mod: module sample
go: to add module requirements and sums:
        go mod tidy
```

次のような `go.mod` ファイルが生成されます。

```go.mod
module sample

go 1.17
```

`module sample` の `sample` は、モジュール名です。この名前で実行ファイルが生成されます。
`go 1.17` は Go のバージョンです。

＜参考サイト＞
・[Go言語の依存モジュール管理ツール Modules の使い方](https://qiita.com/uchiko/items/64fb3020dd64cf211d4e)

**② go run コマンド**

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go run .
Hello world!
```
`go run .` という形でコマンドを打てば、処理が実行されます。
ファイル名を書かずとも、`.` とするだけで、対象となるファイルを全て読み込んでくれます。

**③ go build コマンド**

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go build

C:\golang\sample>.\sample
Hello world!
```

`go build` というコマンドで、実行ファイルを作成します。ファイル名の指定は不要です。
モジュール名に基づき、`sample.exe` という実行ファイルができます。
生成された実行ファイルは、`.\sample` というコマンドで実行できます。

## 2. ファイル２つで実行（同一パッケージ）

ファイルを分割してコードを記載する場合です。
ここでは、２つのファイルを同一のパッケージ（main パッケージ）とします。

### 2-1. ソースコードの記載

次のように２つのファイルを同一フォルダに作成します。

```
sample
├──foo.go
└──bar.go
```

main ファイル（`foo.go`）には、次のように記載します。

```foo.go
package main

import "fmt"

func main() {
	fmt.Println(add(3, 5))
}
```

もう一つのファイル（`bar.go`）には、次のように記載します。
パッケージは同一なので、こちらも `package main` としておきます。

```bar.go
package main

func add(a int, b int) int {
	return a + b
}
```

### 2-2. プログラムの実行（Modules を使用しない）

まず、Modules を使わないで実行する場合です。

**① go run コマンド**

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go run foo.go bar.go
8
```
作成したフォルダにディレクトリを移動した上で、`go run ファイル名 ファイル名` という形でコマンドを打ちます。
`3 + 5` の処理が実行され「8」と表示されます。
main ファイル（`foo.go`）のみを指定しても動作しないため、使用するファイルを全て指定する必要があります。

**② go build コマンド**

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go build foo.go bar.go

C:\golang\sample>.\foo
8
```

`go build ファイル名 ファイル名` というコマンドで、実行ファイルを作成します。
`foo.exe` という実行ファイルができます。
生成された実行ファイルは、`.\foo` とコマンドを打てば実行されます。

### 2-3. プログラムの実行（Modules を使用する）

次に、Modules（`go.mod`）を使用する場合です。

**① go.mod の生成**
`go.mod` ファイルを作成していない場合は、次のコマンドでファイルを作成しておきます（[前述](#1-4-1-gomod-の生成)参考）。
`sample` はモジュール名です（何でも構いません）。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go mod init sample
```

**② go run コマンド**
`go run .` という形でコマンドを打てば、ファイル名を指定しなくとも処理が実行されます。
ファイルが１つの場合と、全く同じコマンドです。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go run .
8
```

**③ go build コマンド**

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go build

C:\golang\sample>.\sample
8
```

`go build` というコマンドで、実行ファイルを作成します。ファイル名の指定は不要です。
生成された実行ファイルは、`.\sample` というコマンドで実行できます。`sample` はモジュール名です。
こちらも、ファイルが１つの場合と、全く同じコマンドとなります。

## 3. 複数のパッケージで実行

最後に、パッケージが複数ある場合です。

### 3-1. ソースコードの記載

次のように、`sub` パッケージ（フォルダ）を作って、`bar.go` というファイルを作成します。

```
sample
├──foo.go
└──sub
   └── bar.go
```

main ファイル（`foo.go`）には、次のように記載します。
sub パッケージの import は、フォルダを含めて `sample/sub` と指定します。

```foo.go
package main

import "sample/sub"

func main() {
	sub.Hello()
}
```

もう一つのファイル（`sub/bar.go`）には、次のように記載します。
パッケージ名は `sub` としておきます。

```sub/bar.go
package sub

import "fmt"

func Hello() {
	fmt.Println("hello!")
}
```

### 3-2. プログラムの実行（Modules を使用する）

Modules（`go.mod` ファイル）無しで実行する方法がよく分りませんので、素直に、Modules を使用します。

**① go.mod の生成**
`go.mod` ファイルを作成していない場合は、次のコマンドで作成します（[前述](#1-4-1-gomod-の生成)参考）。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go mod init sample
```

**② go run コマンド**
go run を使う場合は、コマンド `go run .` の１行で処理が実行されます。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go run .
hello!
```

**③ go build コマンド**
実行ファイルを作る場合は、コマンド `go build` で作成します。
生成された実行ファイルは、`.\sample` で実行します。

```:ターミナル（コマンドプロンプト）
C:\golang\sample>go build

C:\golang\sample>.\sample
hello!
```