Open3

【Is Go God?】Go言語のインストールからDB接続まで

rudyrudy

インストール

  • ダウンロード
    • mac の場合 CPUアーキテクチャがARM64x86-64かは、ターミナルで$ uname -mで調べる
% uname -m
arm64
  • インストール
    • ダウンロードしたインストーラを実行
    • おわったら下記確認
% go version
go version go1.19.2 darwin/arm64

なにはともあれHello World

  • go mod initgo.modを作る
    • node.jsでいうpackage.json。モジュールの依存関係管理する
% 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
  • パッケージ、メソッドにカーソル当てて説明が出るようになった。たすかる。


rudyrudy

packageを作る

├── README.md
├── greeting
│   ├── go.mod
│   └── greeting.go
└── hello
    ├── go.mod
    ├── go.sum
    └── hello.go

  • 同じディレクトリにすでにmain()を含むpackage(hello.go)があると、エラーになる
    • 同じディレクトリに2つ以上のモジュールは存在できない
    • 別々のディレクトリ作って、それぞれでgo mod initgo.modを作ったら下記エラー
    • go.workをルートディレクトリに作る(Workspacesモードにするため)
      • Workspaceモード:Go1.18以上で使える、複数モジュールの開発を便利にするモード(各go.modに、モジュール同士のrequirereplaceディレクティブを書かなくて良くなる)
% go work init greeting hello
go.work
go 1.19

use (
	./greeting
	./hello
)
  • go.workuseに記載したモジュールでは、go.modreplaceディレクティブを記載しなくて良い

  • ./greetingを消してみると

    • 依存関係を解決できない
go.work
go 1.19

use (
	// ./greeting
	./hello
)

  • hello/go.modgreetingモジュールのrequirereplaceディレクティブを追加するとエラー消える
hello/go.mod
require example.com/greeting v0.0.0-unpblished
replace example.com/greeting v0.0.0-unpblished => ../greeting
rudyrudy

REST APIを作る

流れ

  • とりあえず簡単なエンドポイント何本か建てる
  • DDDアーキテクチャでディレクトリ構成
    • interface層ではGin?(httprouterというのもある)
    • infrastructure層はDB接続後回し、mockでよろし
  • Swaggerの生成
  • DB接続
    • Docker MySQL

その他Tips

Go VSCode 補完