Golangを初めて学んだので基本情報をまとめてみた

フレームワークの評価等は個人の所感になります。

## 特徴

なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由
http://www.yunabe.jp/docs/why_golang_is_good.html

- Google製(2009年)。C言語、utf8、memcachedの開発者同士が共同開発
-  **高パフォーマンス**
    - バブルソート性能比較で、PHP5.6の82倍、PHP7の32倍
        - https://liginc.co.jp/284306
    - 素数計算性能比較で、Pythonの80倍、C, Javaとほぼ同速度
        - https://meideru.com/archives/2879#i-2
- **シンプルで厳格な文法**
    - 表現のブレが無いように複数の書き方を極力許さない
        - while無しでforで表現
        - 三項演算子無し
    - 不具合が起きそうな記述は許さない
        - コンパイル時に以下はすべてエラーとなる
            - 使われていない変数
            - 値を代入したのに読み出されていない変数
            - 読み込んだだけで使っていない外部ライブラリ
- **公式の開発支援ツールが充実**
    - フォーマッタ
        - **書式が強制される。変更不可だが書式で悩む必要が無い。**
            - go fmt
                - フォーマットのみ
            - go import
                - フォーマット + 不足ライブラリ補完。gofmtの上位互換。
    - ユニットテスト
        - go test
    - 静的解析
        - golint, go vet
    - ドキュメント確認
        - godoc
- **並列処理が簡単に書ける(goroutine/channel)**
- **シングルバイナリでどこでも動作する**
    - クロスコンパイルで各OS、CPUアーキテクチャ向けに単一の実行ファイルが作れる
    - デプロイは対象に実行ファイルを置くだけ、実行環境の用意は不要
<pre>
  Linux: GOOS=linux GOARCH=amd64 go build main.go
  Windows: GOOS=windows GOARCH=amd64 go build main.go
  MAC: GOOS=darwin GOARCH=amd64 go build main.go
</pre>
- 文法に癖がある
  - **オブジェクトでなく構造体**
<pre>
type Person struct{ Name string }
// Person 型に対してメソッドを定義する
func (p Person) Greet(msg string) {
    fmt.Printf("%s, I'm %s.\n", msg, p.Name)
}
func main() {
    p := Person{Name: "Taro"} // 値型の変数を用意する
    p.Greet("Hi")             //=> Hi, I'm Taro.
}
</pre>
  - **返り値を複数持てる**
  - **例外構文が無い**。いわゆるtry-catch-finallyは以下のように表す
<pre>
  package main
  import (
      "log"
      "os"
  )
  func main() {
      f, err := os.Open("filename.ext")
      if err != nil {
          log.Fatal(err)
      }
      defer f.Close()
  }
</pre>


## ユースケース

- 得意
    - バッチやAPI等、速度が必要な内部処理
    - 並列処理
    - microservice
- 苦手
    - Webアプリケーション
      (Web系F/Wが乱立しており、他LL(PHP,Ruby,Python..etc)のようにまだデファクトスタンダードというのがなさそう)
- 使用例
    -  製品
        -  Docker, kubernetes, Packer, Mackerel, 
    -  事例
        -  メルカリ・ソウゾウでは どうGoを活用しているのか？
            -  社内ツール(テスト結果からAPIドキュメント自動作成)、プッシュ配信基盤、入稿管理ツール
            -  https://www.slideshare.net/takuyaueda967/mercari-souzoh-golang
        -  GunosyのMicroServicesの現状とGoの使い所
            -  管理用APIの大半がGolang、画面系はDjangoやRails
            -  https://speakerdeck.com/ymatsuwitter/gunosydefalsemicroservicesfalsexian-zhuang-togofalseshi-idokoro
        - FINAL FANTASY Record Keeperを支えたGolang
            - マスタデータのフォーマット変換等にGoを活用
            - http://sssslide.com/www.slideshare.net/shibukawa/final-fantasy-record-keepergolang
        - インテリジェンス社活用事例
            - データ連携/集計、アラート、並列処理などバッチ系にGoを活用, Web側はHackを利用
            - https://career.levtech.jp/hikalab/report/detail/33/
        - トークノートとGolangと私
            - WebAPI部分をGoで実装、パフォーマンス改善やMicroService化で活用
            - https://www.slideshare.net/leverages_event/ss-49021768?ref=https://career.levtech.jp/hikalab/report/detail/33/


## 開発環境導入手順

### 前提
- 以下の環境変数指定が必須
    - **GOROOT**
        - GOのシステムパス
        - 通常は/usr/local/goが多い
        - 「go env GOROOT」で確認可能
    - **GOPATH**
        - GO開発用の作業データパス
        - 通常は\$HOME/devや$HOME/goが多いらしい
        - GOROOTと同じパスに出来ない
        - 初期設定時にPATH=\$PATH:GOPATH/binを通す必要あり
            - export PATH=\$PATH:$(go env GOPATH)/bin

### 導入手順
Linux環境で動かす前提。
バージョンは以下サイト見てその時の最新版を使うと良いと思われる。wgetの対象は適宜読み替え
<pre>
  cd /usr/local/src
  wget https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz
  tar zxvf go1.11.5.linux-amd64.tar.gz
  mv go /usr/local
  export GOROOT=/usr/local/go
  export GOPATH=$HOME/go
  export GOBIN=$GOPATH/bin
  export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
</pre>

## フレームワーク
Webフレームワークは若干乱立ぎみと思われるが、
用途上 比較的軽量シンプルなものが好まれる傾向あり(echo,Gin等)
フルスタックF/WならJavaのPlayFrameworkを参考にしたRevel等があるが、
単純にドキュメント等も多いLL系のフレームワークを選ぶ方が良さそう。
ORMはGORMがメインで使われている印象

- Webフレームワーク
    - Golang フレームワーク比較
        - https://qiita.com/yumin/items/5de33b068ead564ebcbf
    - Go言語Webフレームワークランキング
        - https://qiita.com/loftkun/items/1a9951d1864bebdc51e1
- ORM
    - Go言語でのORMを色々検討してみた
        - https://goo.gl/9tvXFN

## 学習方法

他言語を触った事がある人は、TourOfGoチュートリアルを一通りやれば、
基礎文法や「他言語で言うxxは、Goで言うxxだ」というざっくりイメージはつかめそうです。
学習本は実践Tips本や、チュートリアル系の手を動かせる本が良さそうです。

- 公式
    - 英語: https://golang.org/
    - 日本語訳サイト: http://golang.jp/
- 基礎文法チュートリアル
    - Tour Of Go(日本語訳)
        - https://go-tour-jp.appspot.com/welcome/1
    - PHPerがGolangを試してみた 前編
        - http://tech.innovation.co.jp/2017/12/19/P-H-Per-Golang.html
    - PHPerがGolangを試してみた 後編
        - http://tech.innovation.co.jp/2018/03/14/golanggolangphperphper.html
- 実践用Tips
    - Web
        - Goコードの書き方
            - http://golang.jp/code
        - Effective Go(日本語訳)
            - http://golang.jp/effective_go
        - Go 言語(Golang) はまりどころと解決策
            - https://www.yunabe.jp/docs/golang_pitfall.html
    - 本
        - みんなのGo言語
            - https://www.amazon.co.jp/dp/B01LMS7B1O/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
- 言語仕様
    - http://gihyo.jp/dev/feature/01/go_4beginners
- 技術選択
    - 2016年資料だけど複数社のライブラリ等の技術選択とその理由がまとまっていて大変参考になります。
    - https://godgarden.goat.me/3Hf9qTNO
- チュートリアル
    - Whispering Gophers(チャットアプリチュートリアル)
        - http://whispering-gophers.appspot.com/talk.slide#1
    - Learn Go with tests(TDDチュートリアル)
        - https://quii.gitbook.io/learn-go-with-tests/
    - 現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発(Udemy動画チュートリアル)
        - https://www.udemy.com/go-fintech/