やりたいこと
滅多にやらないプロジェクトのセットアップ方法の備忘録
とりあえずHello world!を表示するサンプルプロジェクトを立ち上げる
環境
- macOS Monterey 12.2.1
- VSCode
- go 1.18
$ go version go version go1.18 darwin/arm64
プロジェクト作成
作業ディレクトの作成
作業用ディレクトリ作成して、移動
mkdir sample-project
cd sample-project
パッケージ管理の初期化
Golangでは基本的にGo Modulesを使用してパッケージを管理する。(Node.jsのnpmやPythonのpipのようなものです。)以前はGOPATHでパッケージ管理していたみたいですが、今はGo Modulesで管理。
モジュールの初期化。
下記コマンドを実行したディレクトリがプロジェクト(リポジトリ)のルートディレクトリになる。
go mod init {プロジェクト名}
プロジェクト名は、下記の命名規則に従う
- GitHubなどで公開する場合:
github.com/{GitHubユーザー名}/sample-project
- Localのみ:
sample-project
実行すると、go.mod
がプロジェクトのルートに作られているはずです。このファイルでこのリポジトリのパッケージを管理します。
参照するパッケージ追加/削除
-
パッケージの追加
(参照するパッケージをgo.mod
に追加しているだけで、インストールはしていないらしい)go get {パッケージ名}
グローバルインストールする場合は
go install
を使うらしいが、リポジトリ内だけの操作であれば不要だと思う。 (Go 1.18~go get
削除されたのではなく、go get
を使ってインストールができなくなっただけっぽい) -
パッケージの更新や削除
go mod tidy
使われていないパッケージが
go.mod
にあれば削除してくれる。 ちなみにgo get
しなくてもimport
に新規パッケージが記述されていれば、このコマンドでgo.mod
に追加される
サンプルコード作成
エディタで下記をリポジトリのルートに作成。
(ちなみにVSCodeのGoの拡張機能を入れるコードのフォーマットを自動でやってくれます)
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello World!")
}
実行
$ go run main.go
Hello world!
補足
- ファイルが分かれていても同一ディレクトリ内であれば同一パッケージになり、同一パッケージであれば別ファイルの関数や変数でもprivateなものとして呼び出すことができます。
- ディレクトリが異なる場合は別のパッケージになり、呼び出しには
{パッケージ名}.{関数名}
と記述する必要があります。また呼び出せるのはPublicで宣言されているものだけです。
package main
import (
"fmt"
)
func helloJp() {
fmt.Println("Hello Japan!")
}
package us
import (
"fmt"
)
func HelloUs() {
fmt.Println("Hello US!")
}
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello World!")
helloJp() // 同じディレクトリの別ファイルのprivate関数の呼び出し
us.HelloUs() // 異なるディレクトリのPublic関数の呼び出し
}
これを踏まえて、プロジェクトのディレクトリ構造を決める
ビルド
goはコンパイラ言語なので実行にはビルドする必要がある。(go run
はコンパイル+実行)
コンパイルした後のビルドファイルはGoの環境がなくても実行できるバイナリなので、デプロイする場合はビルドファイルを使用する。
ビルドファイルの作成
go build {コンパイル後のファイル名} {コンパイルするgoファイル名}
何も指定しないgo build
だけの場合はmain.goがコンパイルされ、リポジトリ名のビルドファイルがリポジトリのルートに作成される。
ビルドファイルの実行
$ ./{ビルドファイル名}
Hello world!
終わり
以上が新規でプロジェクトを始めるときのセットアップ方法