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

このシリーズ目次
- Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで①←今ココ
- Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで②|Wano Group Developers Blog
- Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで③|Wano Group Developers Blog
はじめに
こんにちは。
2019年2月からWanoに入社した成川と申します。
今回はGo言語初学者の私がだいたい2、3週間くらいで
①Goの基本文法を学習
②簡単なCRUDのWebアプリケーション作成
③クリーンアーキテクチャで②のアプリ作り変え
の3ステップで学習を進めましたので、そのプロセスをまとめておこうと思い、
この記事を書かせてもらっています。
(この記事は①の部分になります)
①Goの基本文法を学習
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発 | Udemy
上記のudemy講座の文法部分を教材として使いました。
A Tour of Goを使用しても良かったのですが、入社の勢いで
購入したものがあったのでこちらを使用しました。
(Fintechアプリに興味なくても、基礎事項が結構網羅的でオススメです)
Goの特徴
- ポインタの概念
 私はC言語流派の言語に触ったことがないので、噂のポインタと初対面でした。
 初めは慣れませんでしたが、割とオブジェクト指向言語に触れ合ってプリミティブ型と参照型
 の理解があって、スタック領域とヒープ領域について整理がついているとすっと概念として
 染み込んできやすいのかなって印象です。
- 
クラスがない 
 これまたjavaとrubyしか触ったことないので新鮮でした。
 オブジェクト指向プログラミングに近しいことができるような
 諸所の仕様はあるようなのでとっつきずらさはないかな?
- returnで戻り値を複数指定できる
u, err := uh.postController.GetPosts()
    if err != nil {
        // システム内のエラー
        return c.JSON(http.StatusBadRequest, err)
    }
上記のように、errも含めてメソッドの戻り値でもらえるので
try catchしてエラーハンドリングする必要がないみたいですね。
ただ、独自にラップしてあげないとなんのエラーだかわからなくなりそう。
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型ライブラリ
Goのtimeパッケージの闇を見てる
Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? https://t.co/aCjdqljiyL #Qiita
— nari@エンタメ系エンジニア (@fukubaka0825) 2019年2月6日
学習中の僕は深淵をのぞいてしまったようです。
  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圏の人間だけということはないと思うのですが、天才集団でも
こういう謎仕様ができてしまう事もあるんですね(天才だからか)
Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? – Qiita
Go開発者のRob Pikeさんがgolang-nutsメーリングリストで、
最初からよく考えていればこの順番にはしなかった
開発者さんも後悔はしているんですね、、、
- ベストなORマッパーの不在
Gormが結構メジャーに使われているみたいなんですが、色々惜しい作りが多いようです。
例えばjoinしてデータを取ってこようとすると、
relation相手のデータをpreloadして、それから主テーブルから取得してくる
便利メソッドがあるんです。
しかし、その処理が別々にクエリ走らせてるみたいで、結局joinのSQL生で
書く必要があって中々残念なようですね。
このような痒いところに手が届かないなぁ的なポイントが結構あるようですね。
僕は少ししか弄れてないので、これから悶々とする日々となりそうです。
- 埋め込み(embedded)に要注意
オブジェクト指向言語としてGolangをやろうとするとハマること – Qiita
結局継承でしょ?みたいな理解だと痛い目を見そうです。。
オブジェクト指向言語っぽく学習して、実装もダックタイピングで実現してるし
だいたい一緒でしょってテンションでやってると上記みたいな罠が張り巡らされていそう。
- ジェネリクスがない
Go にジェネリクスがなくても構わない人たちに対する批判について – methaneのブログ 
 
 Goのジェネリクス云々に関してはさんざん議論されているようですが、初学者からすると
 暗黙的型変換がないのでいちいちキャストしたり、sortも型によってメソッドが細分化
 されていたりする部分が気になるのですが、上記の記事をよむに実装時にそこまできになる自体にはならなそうだなという印象。
終わりに
これから続きの②、③を今週中にはあげますので、良かったらその際は読んでみてください。
なにぶんビギナーですので、成長させてくれる愛のあるまさかりを待っております!!
(社内外問わず)
==以下雑談==

Gopher君が可愛すぎてlineのスタンプ買ってしまいました。
グッズ情報とかあったら教えてください。
このままだと勝手にステッカーを作ってしまいます。
参考文献
The Go Programming Language
GoDoc
Goのメリット、デメリット – Sengto – Medium
  なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由
Go言語がダメな理由 | POSTD
なぜ私達は Python から Go に移行したのか – Frasco
いまさら聞けないGo言語 – Qiita
The Go gopher was designed by Renée French.


