Goを使うぞ
理由 is 手伝っている会社で使いそうだから。
何ができるようになればいい?
自分の作業の中にツール化して組み込む
最近欲しいorいい感じだと思っているツール
codicって面白いよねって友人と話していて、CLIのツールとかあるといいかもってなったので作ってみることに。
こんな感じで日本語からcamel,pascalなどのケースを選んで関数名とかをいい感じに作ってくれるサービス
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
で作った。
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
返り値を宣言的に定義できる、これはけっこう可読性高いように見える
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
配列
Mapの定義がちょっとわかりにくい、慣れの問題かな
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
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
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
コマンドライン引数をいい感じに扱える、デフォルトを入れたりオプションとして弾いたり
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マッピング
APIにリクエストしてjsonを受け取ってクラスにマッピングすることはよくあるが、
これをよしなにやってくれるメソッドがある。
{"result":"success"}
というJsonは
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というのがあり、Unmarshalほどではないですが綺麗にかけます。
オススメ。
ただResultは頭文字大文字ね、これ大事。ずっとMappingされなくて悩んでた・・・
使い勝手
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で書かれたフレームワークなり、ライブラリなどにコミットしてみて勉強しならが学ぼうと思う。