368
317

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-15

はじめに

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

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

Fill Struct

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

使い方

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

fill.png

package main

type person struct {
	name string
	age  int
	job  string
}

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

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

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

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

Generate tests

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

使い方

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

test.png

main.go
func sum(x int, y int) int {
	return x + y
}

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

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の中は例えば以下のように書きます。

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

Add Tags To Struct Fields

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

使い方

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

tags.png

type person struct {
	Name string
	Age  int
	Job  string
}

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

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

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を認識しないので置いておく必要があります。

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の方でも、モダンな技術習得やサービス開発の様子を発信したりしているので良かったらチェックしてみてください!

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

参考

368
317
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
368
317

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?