Help us understand the problem. What is going on with this article?

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

はじめに

最近イケイケな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に掲載していますので、良かったらそちらもご覧ください!

参考

yagi_eng
フリーのWeb系エンジニアです。マネジメントやディレクション的なところもやっています。元はクラウドエンジニアでした■モダンな技術習得やサービス開発の様子をTwitterで発信しているので良かったら覗いてみてください!■仕事依頼はTwitterにDM頂けると幸いです■ちなみに趣味は海外旅行やグルメ巡りです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away