🔨

Goで実装を行う際に使用しているツール

2021/07/24に公開

始めに

普段Goの実装を行う際に使用しているツールがあるので簡単にですが紹介します。
気になったものがあったらぜひ試してみてください!

gotests

既存のコードに対してGoテストのひな型を作成できます。
以下のようなコードがあるとします。

main.go
package main

func fullName(firstName, lastName string) string {
    return firstName + lastName
}

gotestsコマンドを実行する。

gotests -all -w main.go

下記のようなファイルを作成してくれる。

main_test.go
func Test_fullName(t *testing.T) {
	type args struct {
		firstName string
		lastName  string
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := fullName(tt.args.firstName, tt.args.lastName); got != tt.want {
				t.Errorf("fullName() = %v, want %v", got, tt.want)
			}
		})
	}
}

gomodifytags

構造体フィールドのタグを更新、追加、削除できます。
下記のような構造体があるとします。

main.go
package main

type User struct {
	Id   int
	Name string
	Age  int
}

Userに対してjsonダグを付与する。

gomodifytags -file main.go -struct User -add-tags json -w

下記のようにjsonタグが付与される。

main.go
package main

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

impl

インタフェースを実装するためのメソッドスタブを生成します。

レシーバーとインタフェースを指定する。

impl 'h *Hoge' error

下記のようなスタブを作成してくれます。

func (h *Hoge) Error() string {
        panic("not implemented") // TODO: Implement
}

goplay

指定したファイルをThe Go Playgroundで動かせるようにする。

ファイルを指定してgoplayコマンドを実行する。

goplay main.go

dlv

Goのデバッガツール

下記のコマンドでmain.goのデバッグを行える。

dlv debug main.go

デバッグ開始。

Type 'help' for list of commands.
(dlv)

packageがmainのmain関数にブレークポイントを設定する。

(dlv)break main.main
Breakpoint 1 set at 0x10cdc78 for main.main() ./main.go:13

実行する。

(dlv) continue
> main.main() ./main.go:13 (hits goroutine(1):1 total:1) (PC: 0x10cdc78)
     8:		Id   int    `json:"id"`
     9:		Name string `json:"name"`
    10:		Age  int    `json:"age"`
    11:	}
    12:
=>  13:	func main() {
    14:		var user User
    15:		user.Id = 1
    16:		user.Name = "Bob"
    17:		user.Age = 20
    18:

nextで次の行まで処理を進められる。

(dlv) next
> main.main() ./main.go:14 (PC: 0x10cdc8f)
     9:		Name string `json:"name"`
    10:		Age  int    `json:"age"`
    11:	}
    12:
    13:	func main() {
=>  14:		var user User
    15:		user.Id = 1
    16:		user.Name = "Bob"
    17:		user.Age = 20
    18:
    19:		var a string

goimports

インポートが不足しているものを追加し、参照されていないものを削除してくれる。コードのフォーマットもそろえてくれる。

main.go
package main

import "log"

func main() {
fmt.Println("hello")
}

goimportsを実行。

goimports -w -l main.go

インポートの過不足を解決してくれて、フォーマットもそろえてくれる。

main.go
package main

import "fmt"

func main() {
        fmt.Println("hello")
}

Discussion