意外と知らないVSCode上でGoを爆速開発するためのTips5選

# はじめに
最近イケイケなGo！
今回はVSCodeでGoを爆速開発するためのTipsを5つ（+おまけ1つ）紹介したいと思います。

自分もつい最近これらを知って、めっちゃ活用して開発効率を上げています！
良かったら参考にしてください。
（良いと思ったらLGTM頂けると嬉しいです😇）

# Fill Struct
空の構造体にフィールドをセットしてくれてとても便利です。
よく使ってます。

## 使い方
空の構造体にカーソルが当たった状態で、Command Palette(`F1` or `Ctrl + Shift + P`)で`Go: Fill struct `と入力。

![fill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/64fc58dc-a252-6a02-a0e0-9893fafa7a96.png)


## 例
```go
package main

type person struct {
	name string
	age  int
	job  string
}

func main() {
	p := person{}
}
```

とあった場合に、以下のように自動生成してくれます。
`person{}`にカーソルを当てておきます。

```go
func main() {
	p := person{
		name: "",
		age:  0,
		job:  "",
	}
}
```

これで大きめ構造体でも簡単に宣言ができて便利ですね。

# Generate tests
テストコードをある程度自動生成してくれます。
対応するテストファイルがない場合は、テストファイルも生成してくれます。
テストコードの実装って面倒なのでかなり重宝してます。

## 使い方
テストを実装したい関数を選択して、右クリックから`Go: Generate Unit Tests For Function`を選択。
Command Paletteからでもできます。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/11550e92-d38b-99a8-f8a6-d8355bc1ce3a.png)

## 例
```go:main.go
func sum(x int, y int) int {
	return x + y
}
```

とあって、sum関数のテストを実装する場合、以下のように`main.go`と同じディレクトリに`main_test.go`を自動生成してくれます。
`sum`を選択しておきます。

```go:main_test.go
package main

import "testing"

func Test_sum(t *testing.T) {
	type args struct {
		x int
		y int
	}
	tests := []struct {
		name string
		args args
		want int
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := sum(tt.args.x, tt.args.y); got != tt.want {
				t.Errorf("sum() = %v, want %v", got, tt.want)
			}
		})
	}
}
```

`TODO`の中は例えば以下のように書きます。

```go
tests := []struct {
		name string
		args args
		want int
	}{
		// TODO: Add test cases.
		{
			name: "1+2=3の確認",
			args: args{
				x: 1,
				y: 2,
			},
			want: 3,
		},
		{
			name: "1+(-2)=-1の確認",
			args: args{
				x: 1,
				y: -2,
			},
			want: -1,
		},
	}
```

`tests`の中のテストケースを回して、エラーがあった場合は`t.Errorf("sum() = %v, want %v", got, tt.want)`でエラーメッセージを出力してくれるので申し分なし。

# テスト実行
上記のテストはテストファイル上からワンクリックで実行できます。
こちらは使っている方も多いと思います。

以下の赤枠内のボタンをクリックすると、内容に応じたテストを実行できます。

![test_excute.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/12fbf4b7-1209-20b7-0e6d-da132c66c29e.png)

# Add Tags To Struct Fields
構造体に自動で構造体タグ（`json:"name"`みたいなの）を付与してくれます。
APIサーバとして使っていて、APIのレスポンスを定義する時やjsonパースする時に便利。

## 使い方
構造体タグを付与したい構造体にカーソルが当たった状態で、右クリックから`Go: Add Tags To Struct Fields`を選択。

![tags.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/c90dee5b-19bc-24b3-6ee7-35b46e30a831.png)

## 例
```go
type person struct {
	Name string
	Age  int
	Job  string
}
```

とあった場合に、以下のように自動生成してくれます。
構造体内にカーソルを当てておきます。

```go
type person struct {
	Name string `json:"name,omitempty"`
	Age  int    `json:"age,omitempty"`
	Job  string `json:"job,omitempty"`
}
```

# Generate interface stubs
interfaceからスタブを自動生成してくれます。

## 使い方
空のスタブを書いて改行し、Command Palette(`F1` or `Ctrl + Shift + P`)で`Go: Generate interface stubs`と入力。
再度入力欄が出るので、`(変数名) *(stubの構造体名) (interfaceのpackage名).(interface名)`と入力。

![stub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/28183516-384c-8433-890d-582bd593a779.png)


## 例
```go
package car

// 関数名や引数は超適当です。。
type Car interface {
	drive(int) string
	stop(int, int) string
	turnLeft(string) int
	turnRight(string, string) (int, error)
}

type carImpl struct{}
```

とあった場合に、以下のように自動生成してくれます。
`type carImpl struct{}`の一行下にカーソルを置いておきます。
2回目の入力では`c *carImpl car.Car`と入力。
`go.mod`を置いておかないとpackageを認識しないので置いておく必要があります。

```go
package car

type Car interface {
	drive(int) string
	stop(int, int) string
	turnLeft(string) int
	turnRight(string, string) (int, error)
}

type carImpl struct{}
func (c *carImpl) drive(_ int) string {
	panic("not implemented") // TODO: Implement
}

func (c *carImpl) stop(_ int, _ int) string {
	panic("not implemented") // TODO: Implement
}

func (c *carImpl) turnLeft(_ string) int {
	panic("not implemented") // TODO: Implement
}

func (c *carImpl) turnRight(_ string, _ string) (int, error) {
	panic("not implemented") // TODO: Implement
}
```

# おまけ
ご存知の方も多いと思いますが、VSCode使っててGoの補完とかLintが効かなくなった場合は、Command Paletteから`Go: Restart Language Server`と入力して実行するとだいたい解決すると思います。

# さいごに
Twitterの方でも、モダンな技術習得やサービス開発の様子を発信したりしているので良かったらチェックしてみてください！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VSCode上でGoを開発するのに便利なTipsをQiitaにまとめました！<br><br>⬇️意外と知らないVSCode上でGoを爆速開発するための5つのTips<a href="https://t.co/a4DDLHOUZs">https://t.co/a4DDLHOUZs</a><br><br>ちょくちょくTwitterでつぶやいていたやつです😇<br>自分もよく使ってるんですけどめちゃ捗ってます<br>Go開発に興味のある方は是非ご覧ください！</p>&mdash; やぎぬ😇行動力エンジニア (@yagi_eng) <a href="https://twitter.com/yagi_eng/status/1328115937732485121?ref_src=twsrc%5Etfw">November 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

また、BOT開発を通じてGoとLINE BOTにまとめて入門する記事をZennに掲載していますので、良かったらそちらもご覧ください！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ZennでGoとLINE BOTの記事を書いてみました<br><br>⬇️BOT開発を通じてGoとLINE BOTにまとめて入門する<a href="https://t.co/QqsEESJMKa">https://t.co/QqsEESJMKa</a><br><br>5ステップに分け、「Hello Worldから始めて、飲食店検索ができるLINE BOTの実装まで」を解説しています<br>GoやLINE BOTに興味のある人は是非読んでみてください😇<br>24,000字超え😇</p>&mdash; やぎぬ😇行動力エンジニア (@yagi_eng) <a href="https://twitter.com/yagi_eng/status/1325027213784326152?ref_src=twsrc%5Etfw">November 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考
- [Try Out Development Containers: Go](https://github.com/microsoft/vscode-remote-try-go)