Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで①

## このシリーズ目次
- Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで①←**今ココ**
- [Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで② - Qiita](https://qiita.com/fukubaka0825/items/8e72db24fb558d43fc5f)
- [Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで③ - Qiita](https://qiita.com/fukubaka0825/items/b79e97cf709a249c13a5)

## はじめに

https://developers.wano.co.jp/1906/
こちらのWanoの技術ブログに上げたものと同じものになります。
Qiitaにも上げて行こうかなと思います。

今回はGo言語初学者の私がだいたい２、３週間くらいで
①Goの基本文法を学習
②簡単なCRUDのWebアプリケーション作成
③クリーンアーキテクチャで②のアプリ作り変え
の３ステップで学習を進めましたので、そのプロセスをまとめておこうと思い、
この記事を書かせてもらっています。
**(この記事は①の部分になります)**

## ①Goの基本文法を学習
[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発 \| Udemy](https://www.udemy.com/go-fintech/)

上記のudemy講座の文法部分を教材として使いました。
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を使用しても良かったのですが、<del datetime="2019-02-25T04:52:10+00:00">入社の勢いで</del>
購入したものがあったのでこちらを使用しました。
(Fintechアプリに興味なくても、基礎事項が結構網羅的でオススメです)


### Goの特徴
  - ポインタの概念
私はC言語流派の言語に触ったことがないので、噂のポインタと初対面でした。
初めは慣れませんでしたが、割とオブジェクト指向言語に触れ合ってプリミティブ型と参照型
の理解があって、スタック領域とヒープ領域について整理がついているとすっと概念として
染み込んできやすいのかなって印象です。

  - クラスがない
これまたjavaとrubyしか触ったことないので新鮮でした。
オブジェクト指向プログラミングに近しいことができるような
諸所の仕様はあるようなのでとっつきずらさはないかな？
  - returnで戻り値を複数指定できる
 
```go
u, err := uh.postController.GetPosts()
	if err != nil {
		// システム内のエラー
		return c.JSON(http.StatusBadRequest, err)
	}
```

上記のように、errも含めてメソッドの戻り値でもらえるので
try catchしてエラーハンドリングする必要がないみたいですね。
ただ、独自にラップしてあげないとなんのエラーかわからなくなりそう。


```go
func goroutine2(s []int,c chan int){
	sum := 0
	for _, v := range s{
		sum += v
	}
	c <- sum
}
```

また、上記のようにスライスsを回してvalueだけsumに足していきたいんすよって時に
無駄に使わないkeyは_で受けて、貰ってこなくて済ませたりできます。
(Goはめちゃコンパイル時厳格で使ってない変数あるとエラー吐くので、こういう使用が必須だったりします。)

- goroutine

並列処理が売りのようで、ここのセクションまぁまぁボリュームあったのですが、
正直なところまだ自分が実装する時にうまく使えるビジョンがないなぁという感じです。

### 私が理解したGoのうまみ
  - クロスコンパイルと速度
  - 型スーパー安全
  - echoがAPI構築フレームワークとして優秀
  - シングルバイナリの手軽さ

### 私が理解したGoの惜しいとこ、ハマりそうなとこ
  - ユーモア溢れるtime型ライブラリ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Goのtimeパッケージの闇を見てる<br><br>Goのtimeパッケージのリファレンスタイム（2006年1月2日）は何の日？ <a href="https://t.co/aCjdqljiyL">https://t.co/aCjdqljiyL</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a></p>&mdash; nari@エンタメ系エンジニア (@fukubaka0825) <a href="https://twitter.com/fukubaka0825/status/1093018245383090176?ref_src=twsrc%5Etfw">2019年2月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**学習中の僕は深淵をのぞいてしまったようです。**

```go
  const (
		//US表記　月、日、時間、年　の順番　その順に数字振ってる
        //なぜかspecificなサンプルでgeneralに指定
		ANSIC       = "Mon Jan _2 15:04:05 2006"
		UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
		RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
		RFC822      = "02 Jan 06 15:04 MST"
		RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
		RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
		//使われがち
		RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
		RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
		RFC3339     = "2006-01-02T15:04:05Z07:00"
		RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
		Kitchen     = "3:04PM"
		// Handy time stamps.
		Stamp      = "Jan _2 15:04:05"
		StampMilli = "Jan _2 15:04:05.000"
		StampMicro = "Jan _2 15:04:05.000000"
		StampNano  = "Jan _2 15:04:05.000000000"
	    )
```

開発チームがUS圏の人間だけということはないと思うのですが、天才集団でも
こういう謎仕様ができてしまう事もあるんですね(<del datetime="2019-02-25T04:50:33+00:00">天才だからか</del>)

[Goのtimeパッケージのリファレンスタイム（2006年1月2日）は何の日？ - Qiita](https://qiita.com/ruiu/items/5936b4c3bd6eb487c182)



<blockquote>Go開発者のRob Pikeさんがgolang-nutsメーリングリストで、
最初からよく考えていればこの順番にはしなかった</blockquote>



開発者さんも後悔はしているんですね、、、

- ベストなORマッパーの不在

Gormが結構メジャーに使われているみたいなんですが、色々惜しい作りが多いようです。

例えばjoinしてデータを取ってこようとすると、
relation相手のデータをpreloadして、それから主テーブルから取得してくる
便利メソッドがあるんです。
しかし、その処理が別々にクエリ走らせてるみたいで、結局joinのSQL生で
書く必要があって中々残念なようですね。

このような痒いところに手が届かないなぁ的なポイントが結構あるようですね。
僕は少ししか弄れてないので、これから悶々とする日々となりそうです。


- 埋め込み(embedded)に要注意

[オブジェクト指向言語としてGolangをやろうとするとハマること - Qiita](https://qiita.com/shibukawa/items/16acb36e94cfe3b02aa1)
<br>
結局継承でしょ？みたいな理解だと痛い目を見そうです。。
<br>
オブジェクト指向言語っぽく学習して、実装もダックタイピングで実現してるし
だいたい一緒でしょってテンションでやってると上記みたいな罠が張り巡らされていそう。


- ジェネリクスがない

 [Go にジェネリクスがなくても構わない人たちに対する批判について - methaneのブログ](https://methane.hatenablog.jp/entry/2017/09/19/Go_%E3%81%AB%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%8C%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%82%E6%A7%8B%E3%82%8F%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%9F%E3%81%A1%E3%81%AB%E5%AF%BE%E3%81%99)
<br>
Goのジェネリクス云々に関してはさんざん議論されているようですが、初学者からすると
暗黙的型変換がないのでいちいちキャストしたり、sortも型によってメソッドが細分化
されていたりする部分が気になるのですが、上記の記事をよむに実装時にそこまできになる事態にはならなそうだなという印象。


## 終わりに
これから続きの②、③を今週中にはあげますので、良かったらその際は読んでみてください。
なにぶんビギナーですので、**成長させてくれる愛のあるまさかりを待っております！！**
（社内外問わず)

==以下雑談==

<img src="https://developers.wano.co.jp/wp-content/uploads/2019/02/07ff4e28bcbd86c855e81e0155b8fd4b-300x155.png" alt="" width="300" height="155" class="alignnone size-medium wp-image-1933" />
Gopher君が可愛すぎてlineのスタンプ買ってしまいました。
グッズ情報とかあったら教えてください。
<del datetime="2019-02-25T04:50:33+00:00">このままだと勝手にステッカーを作ってしまいます。</del>

次がお読みになりたい方は、下のリンクからどうぞ！
[Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで② - Qiita](https://qiita.com/fukubaka0825/items/8e72db24fb558d43fc5f)
## 参考文献
[The Go Programming Language](https://golang.org/)
[GoDoc](https://godoc.org/)
[Goのメリット、デメリット – Sengto – Medium](https://medium.com/@sjnk88/go%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88-%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88-2816384feaca)
  [なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由](https://www.yunabe.jp/docs/why_golang_is_good.html)
[Go言語がダメな理由 \| POSTD](https://postd.cc/why-go-is-not-good/)
[なぜ私達は Python から Go に移行したのか - Frasco](https://frasco.io/why-we-switched-from-python-to-go-19581e27de7c)
[いまさら聞けないGo言語 - Qiita](https://qiita.com/toshi3221@github/items/1d171ca0c32403f4ba95)