Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

このシリーズ目次

はじめに

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

今回は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型ライブラリ

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

  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のスタンプ買ってしまいました。
グッズ情報とかあったら教えてください。
このままだと勝手にステッカーを作ってしまいます。

次がお読みになりたい方は、下のリンクからどうぞ!
Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで② - Qiita

参考文献

The Go Programming Language
GoDoc
Goのメリット、デメリット – Sengto – Medium
なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由
Go言語がダメな理由 | POSTD
なぜ私達は Python から Go に移行したのか - Frasco
いまさら聞けないGo言語 - Qiita

fukubaka0825
Site Reliability Engineer at eureka, Inc. devops/AWS/IaC/Terraform/コンテナ/サーバレス/Go/DDD
https://www.fukubaka0825.dev/
eure
オンラインデーティングサービス「Pairs」の運営・開発をしている企業。様々なモダンな技術を駆使してビジネスを成長させています。
https://eure.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away