4
1

More than 3 years have passed since last update.

Goで開発するときのスニペットまとめ

Last updated at Posted at 2020-10-07

はじめに

Goでプログラミングをする時に個人的に使っているスニペットを簡単にまとめていきます。
めちゃめちゃよく使うものから、たまーにしか使わないものまで様々ですが
使えそう!!!って思ってくださった物だけでも導入してくださったら嬉しいです!

vscodeでのスニペット登録

まずは簡単にvscodeでのスニペットの登録方法について紹介します
Code -> Preferences -> User Snippets
スクリーンショット 2020-10-07 16.33.46.png

とするとこのような画面が出てくるのでgoをクリック
スクリーンショット 2020-10-07 16.34.22.png

すると下記のようなjsonファイルが表示されるのでそこに使いたいスニペットを追加していくような形です
スクリーンショット 2020-10-07 16.34.44.png

スニペット登録の構文

スニペット登録は以下のような構文で行うことができます

"スニペットの題名": {
  "prefix": "どのような文字が打たれたら予測変換として出すか?", 
  "body": [
      "どのような文字列を出すか?",
      "開業したい場合はこのようにカンマ区切りで入力すると開業ができます",
  ],
  "description": "詳細な説明"
},

カーソル位置の指定について

また、スニペットで入力を行ったあと$1と言った文字を入れておくことでどの位置にカーソルを持っていっておくかを決めることができます。
例えば下記のようなスニペットを作成した時には

"Print to console": {
  "prefix": "fff",
  "body": ["fmt.Printf(\"==========%#v\\n\", $1)"],
  "description": "動きを確認するためのlog"
},

スニペット使用後

fmt.Printf("==========%#v\n", )
                        // ↑ここにカーソルが来る

と言うようになります

その他の特殊文字について

挿入したい文字 挿入方法
$ \\$
タブ \t
ダブルクォート \"
シングルクォート \'

スニペット

  • デバッグプリント
  • 構造体function
  • package
  • テーブルドリブンテスト
  • gomock
  • テスト用のgin context
  • httpリクエスト

デバッグプリント

デバッグする用のプリントです。
構造体の中身を確認したり、エラーの場所を特定するときとかに結構使います

"Print to console": {
  "prefix": "fff",
  "body": ["fmt.Printf(\"==========%#v\\n\", $1)"],
  "description": "動きを確認するためのlog"
},

fff

fmt.Printf("==========%#v\n", )

構造体function

構造体メソッドを作成する時に括弧を入力するのがめんどくさすぎるので作成したものです。
個人的にはこれもよく使います

"func": {
  "prefix": "fc",
  "body": ["func ($1) $2($3)($4){", "\t$0", "}"],
  "description": "structの関数を作成"
},

fc

func () ()(){

}

package

ただpackageと出力するだけです
意外と楽でいいですよ!

"package": {
  "prefix": "pac",
  "body": "package",
  "description": "「package」すら書きたくない"
},

pac

package

テーブルドリブンテスト

テーブルドリブンテスト用の雛形を一気に作成してくれるものです
毎回0から書いてると結構めんどくさいのでこれで先にざっくり作成しています
(テーブルドリブンテストについてはこちら

"test func": {
  "prefix": "fct",
  "body": [
    "func Test$1(t *testing.T) {",
    "\tt.Parallel()",
    "\tasserts := assert.New(t)",
    "\ttests := []struct{",
    "\t\tname string",
    "\t\tinput string",
    "\t\toutput string",
    "\t}{",
    "\t\t{",
    "\t\t\tname: \"\",",
    "\t\t\tinput: \"\",",
    "\t\t\toutput: \"\",",
    "\t\t},",
    "\t}",
    "\tfor _, td := range tests {",
    "\t\ttd := td",
    "\t\tt.Run(fmt.Sprintf(\"$1: %s\", td.name), func(t *testing.T) {",
    "\t\t})",
    "\t}",
    "}"
  ],
  "description": "テーブルテストのベース"
},

fct

func Test(t *testing.T) {
    t.Parallel()
    asserts := assert.New(t)
    tests := []struct{
        name string
        input string
        output string
    }{
        {
            name: "",
            input: "",
            output: "",
        },
    }
    for _, td := range tests {
        td := td
        t.Run(fmt.Sprintf(": %s", td.name), func(t *testing.T) {
        })
    }
}

gomock

goでよく使うモックライブラリであるgomockで絶対に書くことになるコマンドです。
意外と描き方忘れがちなので重宝してます。

"Gomock template": {
  "prefix": "tgomock",
  "body": [
    "// gomockの設定",
    "ctrl := gomock.NewController(t)",
    "defer ctrl.Finish()"
  ],
  "description": "test用のginContextを作成"
},

tgomock

// gomockの設定
ctrl := gomock.NewController(t)
defer ctrl.Finish()

テスト用のgin context

goのフレームワークであるginでgin contextを含んだテストを書く時に使うスニペットです(詳しくはこちら)

"test gin Context": {
  "prefix": "tgincontext",
  "body": [
    "// test用のgin contextの生成",
    "ginContext, _ := gin.CreateTestContext(httptest.NewRecorder())",
    "req, _ := http.NewRequest(\"GET\", \"/\", nil)",
    "//req.Header.Add(\"Authorization\", td.inputHeader)",
    "//req.Header.Add(\"Authorization\", td.inputHeader)",
    "ginContext.Request = req"
  ],
  "description": "gomock用の初期定型文"
},

tgincontext

// test用のgin contextの生成
ginContext, _ := gin.CreateTestContext(httptest.NewRecorder())
req, _ := http.NewRequest("GET", "/", nil)
//req.Header.Add("Authorization", td.inputHeader)
//req.Header.Add("Authorization", td.inputHeader)
ginContext.Request = req

httpリクエスト

goでhttpリクエストを飛ばす時に使うスニペットです。
ヘッダーの付与やパラメータの付与方法など、結構忘れがちなのでこれを使っていつも思い出しています。

"HTTP GET request": {
  "prefix": "httpget",
  "body": [
    "url := \"\"",
    "req, err := http.NewRequest(\"GET\", url, nil)",
    "if err != nil{",
    "\treturn nil, err",
    "}",
    "// ヘッダー",
    "req.Header.Add(\"\", \"\")",
    "// クエリパラメータ",
    "params := req.URL.Query()",
    "params.Add(\"\",\"\")",
    "req.URL.RawQuery = params.Encode()"
  ],
  "description": "HTTP GET request"
}

httpget

url := ""
req, err := http.NewRequest("GET", url, nil)
if err != nil{
    return nil, err
}
// ヘッダー
req.Header.Add("", "")
// クエリパラメータ
params := req.URL.Query()
params.Add("","")
req.URL.RawQuery = params.Encode()

終わりに

個人的にはスニペットは定型文であるが細かい設定方法などを忘れがちなものに対して作っているものが多いです。
今後もこれはよく使いそうだな!ってものは随時追記していきたいと思います!

4
1
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
4
1