iOSエンジニアがGoを使ってみての所感

# Goを使うぞ
理由 is 手伝っている会社で使いそうだから。

# 何ができるようになればいい？
自分の作業の中にツール化して組み込む

# 最近欲しいorいい感じだと思っているツール
[codic](https://codic.jp/)って面白いよねって友人と話していて、CLIのツールとかあるといいかもってなったので作ってみることに。
こんな感じで日本語からcamel,pascalなどのケースを選んで関数名とかをいい感じに作ってくれるサービス
<img width="1082" alt="スクリーンショット 2016-01-11 11.24.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/b3bcd1ff-3885-d2d6-e164-64254aa819f4.png">

[APIもある](https://codic.jp/docs/api)
これをラップしてツール化する、apikeyとかも必要なのでいい感じにラップする。

# 資料を読む

MacでGo
https://jobs.forkwell.com/contents/20150420-go-lang-report/
https://go-tour-jp.appspot.com/welcome/1
http://t32k.me/mol/log/go-on-heroku/

環境構築
http://qiita.com/heki1224/items/12d960d93e3b5bd1e9af
https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases/tag/%23740
http://qiita.com/Yuki_312/items/12bdc0017033f383fa9d

Heroku
http://t32k.me/mol/log/go-on-heroku/

わかりやすいgoでweb
http://www.slideshare.net/yasi_life/goweb-16448500

JsonのMapping
http://qiita.com/oahiroaki/items/ff21d9adfb843161d1d8

# で作った。
https://github.com/jumbo-in-Jap/Codic_cli

>20160112 codic projectに追加してもらえました〜
https://github.com/codic-project/Codic_cli

```
$ codic_tool --help
  -casing string
        [camel, pascal, lower_underscore, upper_underscore, hyphen] (default "camel")
  -token string
        initial setting token. (default "default")
$ codic_tool --casing=lower_underscore こんにちは世界
[ こんにちは世界 ]=> HELLO_WORLD
```

### 描きやすい
この資料にチュートリル仕立てで他の言語とかの見地からもコーディングについて書かれている。
Cに近いと聞いていたけど、ぜんぜんもっとわかりやすい。気になったとこは以下かな
http://www.slideshare.net/yasi_life/goweb-16448500

Swiftと比較した記事もある
http://repo.tiye.me/swift-is-like-go/

### Named return values
返り値を宣言的に定義できる、これはけっこう可読性高いように見える

```go

func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}
```

### 配列
Mapの定義がちょっとわかりにくい、慣れの問題かな

```go

var (
    emptyArray []string
    emptyDictionary = make(map[interface{}]interface{})
    emptyArrayNoType []interface{}
)
```

### クラス
Classはない、InterfaceなどをふくめJavaなどとは少し異なる概念を持っているように見える
http://www.golangpatterns.info/object-oriented/classes
http://jxck.hatenablog.com/entry/20130325/1364251563

```go

type Shape struct {
    numberOfSides int
}
func (p *Shape) simpleDescription() string {
    return fmt.Sprintf("A shape with %d sides.", p.numberOfSides)
}
```

クラスもないので継承もない、ただそれをカバーする仕組みもある
http://qiita.com/tenntenn/items/e04441a40aeb9c31dbaf

```go

package main

import "fmt"

type Hoge struct {
    N int
}

type Piyo struct {
    Hoge
    M int
}

func main() {
    piyo := &Piyo{Hoge{1}, 2}
    fmt.Println(piyo.N, piyo.M)
    fmt.Println(piyo.Hoge.N, piyo.M)
}
```

### コマンドライン引数
https://github.com/jumbo-in-Jap/Codic_cli/blob/master/codic_tool.go#L40
コマンドライン引数をいい感じに扱える、デフォルトを入れたりオプションとして弾いたり

```go
	token  := flag.String("token", DEFALUT_TOKEN_STR, "initial setting token.")
	casing := flag.String("casing",DEFALUT_CASING_STR,"[camel, pascal, lower_underscore, upper_underscore, hyphen]")
	flag.Parse()
```

### Jsonマッピング
https://github.com/jumbo-in-Jap/Codic_cli/blob/master/codic_tool.go#L123

APIにリクエストしてjsonを受け取ってクラスにマッピングすることはよくあるが、
これをよしなにやってくれるメソッドがある。

```
{"result":"success"}
```

というJsonは

```go

type Response struct {
	Result string
}

```

というのを定義しておけば

```
	var data []Response
	body, _ := ioutil.ReadAll(r.Body)
	json.Unmarshal(body, &data)
```
で勝手にdatasのResultの値に入る。（最初ここdataをdatasって書いててTwitterで指摘してもらった・・・恥かしいorz！感謝！）
これは非常に便利だ、ちょっと感動した。swiftでも欲しい
余談だが最近はSwiftのMappingでは[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper)というのがあり、Unmarshalほどではないですが綺麗にかけます。
オススメ。
ただResultは**頭文字大文字**ね、これ大事。ずっとMappingされなくて悩んでた・・・

https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/07.2.md

### 使い勝手
go getしたりgo installしたりちょっとしたツールを作るのはめちゃ便利だ。
いままでpythonでスクリプトのツールをよく作ってたんだけど、人に使ってもらったりサーバにおいてクーロンにするのとか考えると非常に使い勝手がいい。
バイナリ一個で全部済むのは気持ちがいいぞ！

### Web Frameworks
今いろいろ調べているけどGin,Revel,Martinあたりがいいらしい。
RailsっぽやつからSinatra系の軽量なものまでいろいろ有る。
趣味とかでちょっとしたクローラとAPIを作ることがあるんだけど、Ginを見ている感じサクサク作れそう。

> SinatraっぽいならそもそもSinatraでよくね？

という発想もあるがRubyより記述がSwiftに近くて描きやすいのでわいはGoで書こうと思う。

# 結論 is ベリー楽しい
ちょっとしたツールなり、クローラなり、APIなどはGoで書いてもいいかなぁと思った。
学習コストが懸念されていたけど、大してwebに造詣のないアプリエンジニアでも書いててストレスも少なくちょっとしたツールをさくっと作れるので便利だ。
Unmarshalに何より感動した。「jsonを取得して結果をよしなに出力する」というのは非常に楽に作れる。
あとは自分で盛り上がっているGoで書かれたフレームワークなり、ライブラリなどにコミットしてみて勉強しならが学ぼうと思う。