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

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

# vscodeでのスニペット登録
まずは簡単にvscodeでのスニペットの登録方法について紹介します
Code -> Preferences -> User Snippets
![スクリーンショット 2020-10-07 16.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/fa4a8c1e-a23f-a0fe-5758-6f6d1575d6fe.png)
↓
とするとこのような画面が出てくるので`go`をクリック
![スクリーンショット 2020-10-07 16.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/cefba627-8654-bc88-0f81-2902c510f889.png)
↓
すると下記のようなjsonファイルが表示されるのでそこに使いたいスニペットを追加していくような形です
![スクリーンショット 2020-10-07 16.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/9476a13b-ef39-f62e-6317-adb68a482c02.png)



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


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

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

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

スニペット使用後

```go:
fmt.Printf("==========%#v\n", )
                     　　　// ↑ここにカーソルが来る
```
と言うようになります

### その他の特殊文字について
|挿入したい文字|挿入方法|
|:---:|:------:|
|$|`\\$`|
|タブ|\t|
|ダブルクォート|\"|
|シングルクォート|\'|

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

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

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

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



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

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

```go:
func () ()(){
	
}
```

## package
ただ`package`と出力するだけです
意外と楽でいいですよ！

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

```go:
package
```

## テーブルドリブンテスト
テーブルドリブンテスト用の雛形を一気に作成してくれるものです
毎回0から書いてると結構めんどくさいのでこれで先にざっくり作成しています
（テーブルドリブンテストについては[こちら](https://qiita.com/takehanKosuke/items/cbfc88c4b7956adede79)）

```json:
"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`

```go:
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](https://github.com/golang/mock)で絶対に書くことになるコマンドです。
意外と描き方忘れがちなので重宝してます。

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

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


## テスト用のgin context
goのフレームワークであるginでgin contextを含んだテストを書く時に使うスニペットです(詳しくは[こちら](https://qiita.com/takehanKosuke/items/849c732c5892d149b50a))

```json:
"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`

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

```json:
"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`

```go:
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()
```

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