SlideShare a Scribd company logo
1 of 11
Download to read offline
gotoは悪?
Webフレームを自作する過程で Echo や Gin
から学んだ正しいgoto の使い方
自己紹介
名前
中村 圭助 (n9te9 : ネクテック)
Gopher歴
4~5年
好きなパッケージ
sync, net/http
職種
サーバサイドエンジニア@DMM.com
goto文を使ったことがありますか?
goto の使い所
1. 変更が少ない箇所 (libとか)
2. 関数呼び出し事態が性能のボトルネックになっている時 (引数コピーとか)
3. トランザクションスクリプトを分割したい時
4. 深いネストから抜け出す時 (ラベル付き continue や break があるけど。。)
→ エッジケースだけどフレームワークやライブラリの局所的なところで使われている
HTTPリクエストのルーティング (Echo, Gin)
大きく3つのロジックでハンドラを呼び出している
1. 静的ルーティング → URIが一意に定まる (e.g. /user/new)
2. パラメータルーティング → パスパラメータを含んだURI (e.g. /user/:id)
3. Anyルーティング → 上二つに当てはまらないルーティング全て (e.g. /user/*)
上記の順序で 基数木 を探索する
ラベル付き continue vs goto
Gin : 1~3 ロジックを一つにまとめて、ラベル付き continue を使う
Echo : 1~3のロジックをラベルで切り分けて、goto を使う
どっちが読みやすい?
サンプルコードで比べてみる
状態を見る if が必要になる
START に戻るので常に
状態を考慮する必要がある
STATUS2, STATUS3
が関数のようになっている
gocognit: 10 gocognit: 8
Status1 → Status2 → Status3 で遷移して Status3の値を出力する
処理速度
大体 1.5倍くらい速い (おそらく if 文で速度が落ちている )
goto が速いわけではないラベル付き continue と速度はほとんど同じ
goto を使うことによって if 文を削れるなら高速化できる
go test -bench でサンプルコードのベンチマークを取る
まとめ
- 変更が少ない箇所 (libとか)
- 関数呼び出し自体が性能のボトルネックになっている時 (引数コピーとか)
- トランザクションスクリプトを分割したい時
goto 文は一概に悪とは言えない
ラベル付き continue, break 方が可読性や処理性能を下げている可能性もある
紹介
webフレームワークを自作してます
https://github.com/lkeix/jazzy
まだ全然できていないのですが、OSSのwebフレームワークを作っています。
GoでのHTTPルーティング実装などに興味がある方は声をかけていただいたら嬉しいです。
最近は linter とかも作っているので興味がある方も気軽に話してください。
おわり

More Related Content

Similar to gotoは悪? Webフレームを自作する過程で Echo や Gin から学んだ正しいgoto の使い方.pdf

ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01Takeshi Komiya
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理Yuto Matsukubo
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察貴仁 大和屋
 
PyCon APAC 2013 Web Secure Coding
PyCon APAC 2013 Web Secure CodingPyCon APAC 2013 Web Secure Coding
PyCon APAC 2013 Web Secure CodingGouji Ochiai
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
20160422_lombokについて
20160422_lombokについて20160422_lombokについて
20160422_lombokについてHidaka Kazutaka
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料Hironobu Saitoh
 
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!仕事でも Groovy を使おう!
仕事でも Groovy を使おう!Oda Shinsuke
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会leverages_event
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオンTakuya Ueda
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
すぐ始めれるクラウド
すぐ始めれるクラウドすぐ始めれるクラウド
すぐ始めれるクラウドSoudai Sone
 

Similar to gotoは悪? Webフレームを自作する過程で Echo や Gin から学んだ正しいgoto の使い方.pdf (20)

ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
PyCon APAC 2013 Web Secure Coding
PyCon APAC 2013 Web Secure CodingPyCon APAC 2013 Web Secure Coding
PyCon APAC 2013 Web Secure Coding
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
20120525 mt websocket
20120525 mt websocket20120525 mt websocket
20120525 mt websocket
 
20160422_lombokについて
20160422_lombokについて20160422_lombokについて
20160422_lombokについて
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料
 
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!仕事でも Groovy を使おう!
仕事でも Groovy を使おう!
 
入門 シェル実装
入門 シェル実装入門 シェル実装
入門 シェル実装
 
Fabric Essentials
Fabric EssentialsFabric Essentials
Fabric Essentials
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会
 
Git tutorial
Git tutorialGit tutorial
Git tutorial
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
Ingress on GKE/GCE
Ingress on GKE/GCEIngress on GKE/GCE
Ingress on GKE/GCE
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
すぐ始めれるクラウド
すぐ始めれるクラウドすぐ始めれるクラウド
すぐ始めれるクラウド
 

gotoは悪? Webフレームを自作する過程で Echo や Gin から学んだ正しいgoto の使い方.pdf