Webアプリの作成でPHPとGoの使い分け方
Webアプリを作るとき、PHPよりもGo言語の方が動作が高速です。
しかし、Go言語はPHPと比べてコードを書くのが少し面倒です。
Go言語の使い方について、参考になる意見がありました。
なぜGoは”悪い”言語なのか
Goに対する批判は数多く存在します。それのどれにもきちんとした理由はあると思います。主な批判は大きく
に集約されるように思います。
Errors as values (例外が推奨されない)
panic, recoverで例外と同じようなことはできますが、Javaの例外のように気軽に使ってはなりません。
個人的にはこのFAQにかかれていることには概ね同意します。
例外で返されたエラーを try {...} catch (Exception e) {...} みたいに処理しないといけないのは無意味に複雑なように思います。
それだけならよいですが、例外が発生するとコードが想定外の順序で実行されて困ったり、何故かこのコードが実行されないなと思ったら、その前に例外で大域脱出していて、しかもその例外が予想外のところでcatchされ握りつぶされていたり、と例外を大規模なプロジェクトの中で正しく扱うのは中々に困難だと思います。
Goの例外は極力使わず、エラーを値として扱うポリシーはよいもの(特に大規模なプロジェクトで、エラーハンドリングが大切なプロジェクトでは)だと思います。
ただ一方で、ちょっとした使い捨ての便利ツールを書く場合や、とりあえずプロトタイプで正常系だけ書きたい時、 あるいは異常が発生したらプログラムを停止してしまって良いような起動時の初期化処理を書く時には、正直Goのエラーハンドリングはかなり面倒くさいです。
エラーが発生した場合はエラーメッセージを出力して処理を中断してしまって問題ない
- 使い捨てあるいは内部ツールで開発者・利用者の数が数人でエラーハンドリングがあまり重要ではない時
- 正常系だけとりあえずプロトタイプしたい時
には例外の方が便利であり、正直Go言語ではあまり効率的にコードが書けないような気がします。
個人的にはそういう用途にはPythonなどを使うのが正しい解決策のように思えます。
何でもGoで書く必要はないのですから。
型の存在すら簡単なプロトタイピングをするのには少し鬱陶しいですしどんな言語も適材適所だと思います。
どこからGolang化していくか?
さて、Goのパフォーマンス性能を活かせて、かつ、現行で走っているサービスに影響がなければ、Golang化したいところ。ただ、移行のコストとかも考えると全てをGoにするのは大変だし、Perlの方が得意なところもあるのでその辺は見極めなくてはいけません。ボケてではMicroservicesという言葉が流行る以前から、ある程度サービスをHTTPレイヤーで切ったコンポーネント化を進めておりました。そこで、大きな部分を一気に変更する、のではなく、小さな一部分だけを違う実装に変えるということが容易です。そこで、目をつけたのがスタンプサーバです。
そんな使い分け方でもいいかな?
プロトタイプは思いつきで書き殴ったコードが多いから、本番投入後はどっちみち1度はリファクタリングしないといけないでしょう。そのときにGo言語でリプレースしていけばOKと。
Go言語の文法自体はシンプルなので覚えやすいですが、イディオムに慣れないとコードをサクサクと書けるようにはならないと思いました。
ソフトウェア工学に於けるイディオム(英: Idiom )は、アルゴリズムやプログラミングのノウハウ、チップを集めたものである。
これがより大規模になったものをデザインパターン、さらに大規模なものはアーキテクチャパターンと呼ぶ。
今まで作ったWebアプリを練習がてらちょっとずつGo言語で置き換えてみたいと思います。
- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (4件) を見る