Open3
【Is Go God?】Go言語のインストールからDB接続まで
インストール
-
ダウンロード
- mac の場合 CPUアーキテクチャが
ARM64
かx86-64
かは、ターミナルで$ uname -m
で調べる
- mac の場合 CPUアーキテクチャが
% uname -m
arm64
- インストール
- ダウンロードしたインストーラを実行
- おわったら下記確認
% go version
go version go1.19.2 darwin/arm64
なにはともあれHello World
-
go mod init
でgo.mod
を作る- node.jsでいう
package.json
。モジュールの依存関係管理する
- node.jsでいう
% go mod init example/hello
go: creating new go.mod: module example/hello
hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello World😅")
}
- 実行
% go run .
Hello World😅
- 新規パッケージを追加したい
hello.go
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println("Hello World😅")
fmt.Println(quote.Go())
}
-
go mod tidy
-
quote
モジュールを追加。 -
go get
コマンドもある
-
% go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
-
go.mod
がこうなった
go.mod
module example/hello
go 1.19
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
-
go.sum
とかいうのもある
go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
VSCode Go拡張機能
golang.Go
- Go拡張機能に怒られた
The "go-outline" command is not available. Run "go install -v github.com/ramya-rao-a/go-outline@latest" to install.
The "gopls" command is not available. Run "go install -v golang.org/x/tools/gopls@latest" to install.
- はいはい
% go install -v github.com/ramya-rao-a/go-outline@latest
% go install -v golang.org/x/tools/gopls@latest
- パッケージ、メソッドにカーソル当てて説明が出るようになった。たすかる。
packageを作る
├── README.md
├── greeting
│ ├── go.mod
│ └── greeting.go
└── hello
├── go.mod
├── go.sum
└── hello.go
- 同じディレクトリにすでに
main()
を含むpackage(hello.go
)があると、エラーになる- 同じディレクトリに2つ以上のモジュールは存在できない
- 別々のディレクトリ作って、それぞれで
go mod init
、go.mod
を作ったら下記エラー
-
go.work
をルートディレクトリに作る(Workspacesモードにするため)- Workspaceモード:Go1.18以上で使える、複数モジュールの開発を便利にするモード(各
go.mod
に、モジュール同士のrequire
、replace
ディレクティブを書かなくて良くなる)
- Workspaceモード:Go1.18以上で使える、複数モジュールの開発を便利にするモード(各
% go work init greeting hello
go.work
go 1.19
use (
./greeting
./hello
)
-
go.work
でuse
に記載したモジュールでは、go.mod
にreplace
ディレクティブを記載しなくて良い -
./greeting
を消してみると- 依存関係を解決できない
go.work
go 1.19
use (
// ./greeting
./hello
)
-
hello/go.mod
にgreeting
モジュールのrequire
、replace
ディレクティブを追加するとエラー消える
hello/go.mod
require example.com/greeting v0.0.0-unpblished
replace example.com/greeting v0.0.0-unpblished => ../greeting
REST APIを作る
流れ
- とりあえず簡単なエンドポイント何本か建てる
- DDDアーキテクチャでディレクトリ構成
- interface層ではGin?(httprouterというのもある)
- infrastructure層はDB接続後回し、mockでよろし
- Swaggerの生成
- DB接続
- Docker MySQL