こんにちは、古賀です!
本記事では、Go言語の
はてな
- 概要や特徴
- フレームワークやORM
- 使ってみた感想
について、お話します。
わたしはバックエンドにGo言語を使用して、個人開発のWEBサービスを開発したのですが、
その実際の経験を踏まえて、今回Go言語についてお話したいと思います。
そのWEBサービスの詳細はこちらです。気になる方はチェックしてみてください!
-
個人開発WEBサービス!eSportsプラットフォーム「SPFans」をリリース!概要と使用技術はこちら!
こんにちは、古賀です! 本記事では、わたしが個人開発したWEBサービス はてな eSportsプラットフォーム「SPFans」 の紹介をします。 以前に紹介し ...
続きを見る
簡単な自己紹介ですが、
わたしは上場IT企業に新卒入社し、プログラマー、システムエンジニアとして約10年間働いた後、
現在フリーランスとして活動しております。
プロフィールの詳細はこちらです。
-
プロフィール
こんにちは、古賀正雄です。現在36歳です。 簡単ではありますが、こちらのページで自己紹介とこのブログについてお話します。 高校時代 学生時代は主に野球をしていました。 進学先の高校も野球で選びました。 ...
続きを見る
※YouTubeに同内容を公開しております。
Go言語(Golang)の概要と特徴
まず、Go言語の概要についてですが、Go言語は
Googleが開発した言語で、WEBサービスを始め、マイクロサービス開発、ドローン、IOT開発でも使用されている
言語です。
特徴としては、
- 静的型付言語&コンパイル言語
- コードがシンプルになりやすい
- 並行処理が楽に書ける
- エラーハンドリング
- 給料、単価が高めな傾向
といったことが挙げられます。
静的型付言語&コンパイル言語
Go言語は静的型付言語であり、コンパイル言語です。
静的型付言語は「C」、「Java」、「TypeScript」などと同じように変数に型が付きます。
これによって、実行する前にエラーに気付けたり、コードが読みやすくなります。
デメリットとしては、ところどころで型変換が必要になるのでコードの量が多少増えます。
わたしは元々「C#」育ちなので、これに関しては抵抗感なく、むしろ安心感があるのでやりやすかったです。
コンパイル言語は実行する前にビルドを行い、ソースコードを機械語になおしてから実行する言語ですが、
反対に実行時にコードを一行ずつ機械語になおすインタプリタ言語より、実行速度が比較的早めです。
パフォーマンス面を気にするのであれば、Go言語は1つの選択肢になるかもしれません。
コードがシンプルになりやすい
Go言語はよく、
「コードがシンプルになりやすい」
と言われています。
これは、Googleが属人的なコードを減らしたい思想でGoを開発したためだそうです。
確かに他のライブラリや他のサービスを導入する時に、自分以外のGoのコードを確認することが多くありましたが、
慣れていくると、比較的楽にコードが読めた気がします。
それにより、Goはチーム開発により向いている言語とも言えると思います。
並行処理が楽に書ける
Go言語には「go routine」という処理があって、並行処理が手軽に実装できます。
わたしがWEBサービス開発で使用した場面は、それほど複雑ではないのですが、
メインの処理とは別に、メール送信処理を実行したり、ストレージにアップロード処理をしたり、
定期的にバッチ処理を実行したりする時に使用しました。
このようにただ単に別に処理を走らせたい場合は、関数を実行する時に「go」を付けるだけなので、非常に楽に書けます。
ただし、
「処理AとBの処理が終わったタイミングでCの処理を実行する」
というような少し複雑な並行処理を行う場合はチャネル管理というのが必要なので、少し難易度が上がります。
並行処理が必要なプログラムであれば、Goを使用すると開発が少し楽になると思います。
エラーハンドリング
Goのエラーハンドリングは他の言語と少し違います。
各関数やメソッドはerror型を返却して、その処理を呼び出した側でエラーハンドリングを行います。
絶対にエラーが起きない処理に関しては、error型を返却しませんが、大抵の処理はerror型を返却することになります。
以下が1例です。
if err := f1(); err != nil { return fmt.Errorf("f1 fail: %w", err) }
また、他の言語で例外処理をする際に「try~catch」を行うことが多いと思います。
Go言語では似たようなものに「panic~recover」というものがありますが、こちらを使用することは推奨されていません。
細かい説明は避けてますが、あくまでエラー処理はerror型を使用して1つずつ処理していくことが基本で、
「panic~recover」は本当に予期せぬエラーが発生する時にのみ使用します。
このあたりもerror型を基本的に使用することにより、シンプルさであったり、可読性を向上させる要因なのかなと思います。
給料、単価が高めな傾向
Go言語を採用している企業の給料や、フリーランスのGo言語案件の単価は高めな傾向があります。
求人数はまだPHPやRubyの方が多くありますが、その分給料や単価は高くなっています。
PHPやRubyと比べると、Go言語の技術者はまだが多くないため、その分需要が高まり単価も高くなっているのだと思います。
技術者がまだ多くないため、Go言語自体が未経験でも、
他の言語を経験していれば案件も十分に獲得できるとエージェントの方から聞いたことがあります。
Goの技術者が少ない理由は、初めて学ぶ言語として選ばれにくいことにあるのではないかと思います。
選ばれにくい理由は、比較的新しい言語というのに加えて、この後お話するフレームワークにあると思います。
Go言語(Golang)のフレームワークとORマッパー
続いてGo言語のフレームワークとORマッパーについてお話します。
Go言語(Golang)のフレームワーク
Go言語のフレームワークには以下のようなものがあります。
- Gin
- Echo
- Aero
- Revel
など
※上から順に求人数が多い
Go言語が特徴的なのはPHPならLaravel、RubyならRailsといった代表的なフレームワークが存在しないことです。
そして、Goのフレームワークの利用率のNo1とNo2が「Gin」と「Echo」なのですが、どちらもフルスタックフレームではありません。
作るサービスの規模や要求されるパフォーマンスによって選択するフレームワークは変わってきますが、
わたしがWEBサービス開発で使用したのはシェア率の高い「Gin」を選択しました。
一番利用されているということもあり、ネット情報も他と比べて多いので、問題が起きた時も自力で解決できると思います。
逆に「Revel」はフルスタックフレームですが、シェア率がそれほど高くないため情報量が少ないです。
Goを始める人にとって、比較的軽量なフレームワークに慣れることも、大事な要素になります。
代表的なフレームワークが決まっていないこと、フルスタックフレームが少ないことが、
初めての言語に選ばれにくい要因になっているのではないかなと思います。
Go言語(Golang)のORM
次にデータベースとの処理を行うGo言語のORMについてです。
ORMは、
- Gorm
- SQLBoiler
- XORM
- sqlx
など
があります。
わたしは比較的使用率が高い「Gorm」を選択しました。
一般的なORMの機能に加えて、標準ドキュメントの読みやすさ、コードからテーブルを生成する「AutoMigration」もあり、
良くも悪くも一般的なORMなので、使いやすいかなと思います。
データベースからコードの自動生成機能が欲しい方は「SQLBoiler」などが選択肢になると思います。
もちろん生クエリを書く人にとってはORMは不要です。
何をどれくらいの規模で開発するかや、開発手法でも変わってきますが、フレームワークと同じで情報量はとても大事です。
ORMは開発を効率化させるものなので、開発中に問題が起きてもすぐに情報が出てきて解決できるORMを選択すべきだと思います。
Go言語(Golang)を使用した感想
ここからは実際にわたしがGo言語を使ってみての個人的な感想を話します。
標準機能がシンプル
Go言語は先程お話した通り、良く誰が書いてもコードが単純になると言われています。
そのせいかどうかわからないですが、標準機能の中に欲しいものがなかったりする場合がありました。
例えばC#の場合だとListに対してGroup化して、それに対してSumしたりすることができたりしますが、
Go言語だと標準機能にないので、毎度ループ処理を使用して記述する必要がありました。
欲しいものがなくても、別の手段で解決することができるからこそ、コードがシンプルになるのではとも思いました。
情報量は他の言語と比べて少なめ
Go言語は他の言語と比べると、出回っている情報は少ないので、調べる能力はかなり問われると思います。
先程もお話した選択したフレームワークによってもかなり変わってきます。
場合によっては、日本語のページではなく、英語のページを調べることもあると思います。
その時は英語が出来ることに越したことはないはないですが、できなくても翻訳を使用するなどして、
プログラミング以外の個人の力量が必要になってくるかなと思います。
調べる力については以前の記事でもお話してますので、こちらも確認してみてください。
ポインタの概念がある
Go言語ではC言語と同様にポインタがあります。
ポインタは「メモリの有効利用」に必要な仕組みですが、ポインタを使用すると参照渡しができたり、
コンピュータにかけるコストを減らすことができます。
他の言語にポインタの概念がないのではなく、大体勝手にやってくれています。
C言語やGo言語ではそれがマニュアルになる感じです。
わたしはC#育ちなので、そのマニュアルな感じに慣れるのに少し時間が掛かりました。
C言語に慣れていると人は、このあたりは全く問題ないと思いますので、Go言語の習得は簡単かなと思います。
勉強になるが初学者向きではないかも
これも先程お話しましたが、よく使用されているフレームワークがフルスタックフレームではありません。
最初から必要なファイルやフォルダが自動で生成されるわけではなく、まっさらな状態からスタートすることになります。
なので、フレームワークが勝手に色々とやってくれて、なんとなくできあがることがなくなるので、
どの処理が必要なのか自分で調べて入れることで、1つ1つの処理の理解が深まって、
非常に勉強になると思います。
勉強にはなるのですが、WEBの知識がある程度必要になるのと、
先程話した情報量やポインタのこともあり、あまり初学者向きな言語ではないと思います。
スクールでもGo言語を採用しているところはほとんどないと思います。
ただ、言語を扱うこと自体は決して難しくないので、セカンド言語として選択するのはアリだと思います。
まとめ:Go言語(Golang)の概要&特徴とWEBサービス開発で使用した感想!
ここまでの話をまとめます。
まとめ
Go言語は、
「Googleが開発した言語で、WEBサービスを始め、マイクロサービス開発、ドローン、IOT開発でも使用されている」
もので、特徴は
- 静的型付言語&コンパイル言語
- コードがシンプルになりやすい
- 並行処理が楽に書ける
- 1つの処理毎にエラーハンドリングを行う
- 給料、単価が高めな傾向
です。
Go言語のフレームワークには、
- Gin
- Echo
- Aero
- Revel
などがありますが、代表的なフレームワークがなく、使用率が高い「Gin」や「Echo」はフルスタックフレームではありません。
ORMには、
- Gorm
- SQLBoiler
- XORM
- sqlx
などがあり、情報量が多く開発手法に合っているものを選ぶと良い。
Go言語を実際に使ってみた感想は、
- 標準機能はシンプルだが欲しい機能がない場合もある
- 情報量は他の言語と比べて少なめ
- ポインタの概念があるので少し慣れが必要
- 勉強になるが初学者向きではない
と思いました!
Go言語を勉強しようと思ったキッカケは、C#の他に使える言語を増やしておきたくて何かサービス作ろうと思ったのと、
今後の単価を上げていきたいとか、需要を見越してとか、そんな理由でした。
もしかすると給料や単価の上昇は、
勉強する人が今後増えて、供給が追いついていけば収まってくるかもしれません。
色々な言語に手を出さずに1つの言語を極めるのもアリだと思いますが、
1つの言語で生きていくに不安を感じたら、その時はGoを選択すると良いかもしれません。