見出し画像

go: ソースファイルの分割

 今まで宗教的な理由から避けてた未使用変数の放置が許されない go 言語を、今日から勉強し始めることにしてみた。

 しばらく使ってて、include や import みたくお手軽なソースの分割が必要になってきたので、そのやり方について簡単に書いときます。

● ひとつのソース

  まずは基本。一個のソースだけの場合。

//
// main.go
//
package main

import (
	"fmt"
)

func main() {
	fmt.Printf("hello, world.\n")
}

 これをビルドして、ちゃんと動くか確認します。タイプミスが無い限り、まず問題はないと思います。

$ go build main1.go
$ ./main1
hello, world.

● ふたつのソースに分割

 先ほどのソースをあえて2つに分割します。注意点は、両方とも package main とすることです。

//
// main2.go
//
package main

func main() {
	hello()
}
//
// mylib.go
//
package main

import (
	"fmt"
)

func hello() {
	fmt.Printf("hello, world.\n")
}

 そしてビルドコマンドはこうなります。必要なソースファイル名を全部書くことになります。

$ go build main2.go mylib.go
$ ./main2
hello, world.

  基本はこれだけです。

● 補足

実行ファイル名の指定

 ビルドすると、最初のソースファイル名が実行ファイル名に使われてしまうので、-o オプションで実行ファイル名を指定しておいた方が確実です。

$ go build mylib.go main2.go   # これだと mylib で実行ファイルが作成される
$ go build -o main2 mylib.go main2.go  # これで main2 で作成される

ビルドスクリプトの作成

 汎用のビルドスクリプトを作っておくとラクです。例えば次のような build.sh を作成して実行権限を付加  chmod +x build.sh  すれば、

#!/bin/bash

# スペースがあるファイル名対策
IFS=$'\n'

# 拡張子が go のファイル名を検索して、配列 F に代入する
FILES=( $(find ./ -type f -iname "*.go") )
echo "Sources: ${FILES[@]}" >&2

# 実行ファイル名は a.out に固定している。
go build -o a.out "${FILES[@]}"
$ ./build.sh
$ ./a.out
hello, world.

ソースファイルが何個になっても自動で拾ってビルドしてくれます。

最後まで読んでいただきまして、ありがとうございました!