GoでWebサーバーを作成する3

# はじめに
Golangをもちいてapiサーバーを作成するさいに調べたことをまとめます。

## Golangの基礎
### ポインタについて
ポインタは変数の値ではなく、変数が格納されてるアドレスをわたす。
引数やレシーバを関数内で書き換える必要がある場合や、大きな構造体や配列を扱う場合に使用するとよい。

https://zenn.dev/uji/articles/f6ab9a06320294146733

&は、変数からそのポインタを抽出するのに使用する。
*はポインタが指し示す変数の実体を抽出する。
*はポインタ型の宣言をするときに使用する。

https://qiita.com/tmzkysk/items/1b73eaf415fee91aaad3

### 変数の初期値
golangでは、明示的な初期値なしで宣言された変数にはゼロ値が与えられます。

https://go.dev/tour/basics/12
https://qiita.com/tenntenn/items/c55095585af64ca28ab5

### 委譲　embedded
GOでは継承は使えない　

https://qiita.com/Maki-Daisuke/items/511b8989e528f7c70f80

### nilって何
Goでは、nilはポインター、インターフェイス、マップ、スライス、チャネル、および関数タイプのゼロ値を表す。
nilは何らかの「未定義」状態を意味するものではなく、それ自体が値。 Goのオブジェクトは、その値がnilである場合にのみ、nil。

[golangでnilはどういう意味ですか？](https://www.web-dev-qa-db-ja.com/ja/go/golang%E3%81%A7nil%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/823710494/)

###  fmt.Println()とlog.Println()の違い
logで出力されたメッセージには、実行時間が記載されるので、より詳しいlogを残せる。

https://tsujitaku50.hatenablog.com/entry/2017/05/01/190250

### メソッドのレシーバータイプ（値 or ポインタ）について
>メソッドとは、レシーバーを持つ関数のことです。
そしてレシーバーは、メソッドの定義において、メソッド名の前にパラメーターとして定義されるものです。

ポイントレシーバーのほうが汎用性高そう。
レシーバー自体を変更するならポインタレシーバー。

https://kazuhira-r.hatenablog.com/entry/2021/01/04/131425

### Goでのjson構造体の扱い方

https://www.asobou.co.jp/blog/web/marshal-unmarshal

## Ginとは
Ginは、Golangのフレームワーク

https://qiita.com/ozora/items/0597e52b3f9c1759e292

urlパラメータの取得方法、bodyの取得方法

https://www.naka-sys.okinawa/golang-gin-parameter/

https://qiita.com/Syuparn/items/9e6fb68afb5418893c23?fbclid=IwAR13IylgFeDFfFbKFN3TeWw8m3UvVH29rlE9yVFXhdwA8qU8liKaZtWO8K4

https://nansystem.com/gin-get-post-json-form/

https://ipeblog.com/golang-gin-json/304/



## GolangのMVCモデルアプリ

MVCモのデルのAPIを作成するときに参考にした記事。

https://zenn.dev/ajapa/articles/65b9934db18396

https://liginc.co.jp/584227?fbclid=IwAR3YYtrbhZx2gGXzz4GIfB-orDS9C_vFEndwd2I5EcxZa400lyiff88Wch4

## GoAPIでDTOを実装する
>DTOとは
ドメイン層をインフラ層(DB)から分離したいときに使います。
例えば、以下のようなモデルが定義されているとします。
このとき、DBでstatus = "0" or "1"が管理されているとしても、DTOを使用すれば、ドメイン側ではStatus = "active" or "inactive"などに変換して取り扱うことができます。

https://qiita.com/suzuki0430/items/c493d9502ac37c952c8c

## Golangのエラーハンドリング
エラーは上流に委譲、ログに出力することが主。

https://zenn.dev/nobonobo/articles/0b722c9c2b18d5#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%EF%BC%94%E7%A8%AE

エラーを含めた簡単なレスポンスの返し方

https://selfnote.work/20200514/programming/golang-with-gin4/

## golliraを用いたルーティング
golliraは、ルーティング用のライブラリ

https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a#%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF

## ルーティングでのミドルウェアを実装

https://qiita.com/tobita0000/items/d2309cc3f0dd32006ead

## gormライブラリでDB操作
gormとは、golangのorマッパー

公式リファレンスをわかりやすくまとめている記事。

https://qiita.com/gold-kou/items/45a95d61d253184b0f33#insert

公式

https://gorm.io/ja_JP/

gormを用いたDBとの接続方法

https://zenn.dev/ajapa/articles/aa9b59dd30c501?fbclid=IwAR3sh-WIqOJmLV1x84q0Tv511bf9Mn-jquAAVj4oDdFGC3O-XoXKpepfmHg

トランザクション

https://note.com/keyem/n/n3ed9aaf07e68

ページング処理のSQLについてlimitとoffset

https://qiita.com/nkojima/items/c51e62c8d2934c4e8ed3

## Golang その他

https://ashitani.jp/golangtips/tips_regexp.html

https://zenn.dev/eri_agri/articles/859a3362db8386

https://www.start-point.net/maps/tool/