Go言語ってなんか速くて良いらしいけど、何がいいのかよくわからない。
最近知り合いがプロジェクトで使ってるらしいからちょっと気になるけど、実際どんな言語なの?
そんな疑問を持つこともありますよね。Go言語には色々な魅力があり、それを知ることでGo言語の良さをより理解できます。
今回はGo言語の5つの特徴や学び方のご紹介、そしてGo言語を学ぶ人が押さえておくべきいくつかの用語についての説明をしていきたいと思います!
なお、次の記事ではそもそもGoとはどんなプログラミング言語なのか、その特徴をできることや将来性も交え詳しく解説しているので良ければ参考にしてください。
→ Go言語とは?特徴やできること、学習方法をわかりやすく解説
そもそもGo言語とは
もともとはGoogleで開発された
Go言語はGoogleで開発され、2009年ごろから使用が開始されました。Robert Griesemer, Robert “Rob” C. Pike, Kenneth Lane Thompsonの3名によって設計されています。
余談ですが、開発言語にはよくキャラクターがつきます。Go言語のキャラクターはGopherくんというキャラクターです。
このキャラクターはハリネズミだそうですよ。ちょっとひょうきんですが、可愛いですよね。
静的型付け言語である
そもそも静的型付け言語とはなんでしょうか。静的型付け言語とは、変数・定数などの宣言時に中に入れる値のタイプをあらかじめ決めておくタイプの言語です。
これは変数・定数だけにとどまらず、例えばメソッドや関数などの戻り値もどのようなタイプを返すのか?ということを決めておきます(「メソッド」や「関数」については後ほど詳しく解説します)。タイプ(型といいます)には色々なものがありますが、メジャーなものでいうとString(文字列)、Int(数値)、Float(浮動小数)、Array(配列)などです。
他にも色々な型があり、言語により少しずつ異なります。そして、宣言時にString(文字)型を指定していた変数にプログラマーが誤って数値(1、2、3など)を入れてしまうと、ビルド時(※)にエラーが発生します。
これはメソッドや関数でも同じです。戻り値を指定していない関数で文字列を返そうとしたり、文字列の戻り値を指定していたのに数値を返そうとするとビルドエラーが発生します。戻り値というのは、メソッドや関数の処理が終わったときに呼び出し元に返す値のことです。
こういった仕組みの開発言語が、静的型付け言語と呼ばれています。
※ビルド・・・コンパイル前にソースコードにエラーが含まれていないか?などをチェックし、問題なければ「コンパイル」に移ります。
※コンパイル・・・開発言語というのは人間に読みやすく作られたもので、コンピュータには理解できません。これをコンピュータに理解できるように変換することをコンパイルといいます。コンパイルをしなくても利用できる言語もたくさんありますが、Go言語はコンパイルしないと実行できません。
参考URL: https://proengineer.internous.co.jp/content/columnfeature/6308#section100
Go言語の特徴を5つご紹介
プラットフォームを選ばない
Go言語は、公開当時はWindows非対応でした。Macを使っている人にしか利用できませんでした。
エンジニアでもWindowsを使っている人はとても多いと思いますので、Windows非対応だったというのは大きな足かせになっていたことでしょう。ですが、それも約3年後にはすぐに解消されました。
現在ではWindows、Mac、Linuxなどプラットフォームを選ばずに開発することができます。また、iOS・Androidにも対応しているのでPCに限らず開発することができます。
そしてもちろん、GCP(Google Cloud Platform)やAWS(Amazon Web Services)などのクラウドサービスでもGo言語を使用することができます。たった10年程度でここまでプラットフォームを広げたのだと考えると、本当にすごいですね。
クラスという概念が無く、パッケージ単位でプログラミングする
JavaやPHPなどを触ったことがある人はクラスを作ってその中に関数を入れて・・・という開発手法に慣れているかもしれません。ところが、Go言語にはクラスという概念がありません。
そもそもクラスとは何かというと、オブジェクトのテンプレートです。もっとざっくりと言ってしまうと、変数・関数・定数などのソースコードの集まりです。
プログラムはそのソースコードの集まりであるクラスを組み合わせて作られるのですが、Go言語にはそのクラスがありません。ではどのように開発しているかというと、パッケージ・関数・メソッド・構造体・・・といったものを組み合わせてプログラムを作っています。
パッケージは変数や関数の集まりですが、Javaでいうところのクラスとは異なります。パッケージ1つがオブジェクト1つと紐づいているわけでは無いからです。
オブジェクトを表すというよりは、ソースコードをきれいに分割するのがパッケージです。
コンパイルと実行速度が早い
コンパイルというのはコンピューターが理解できるようにプログラムを変換するもの、というのは先程記載しました。Go言語ではそのコンパイル速度が高速だとされており、公式サイトでも下記のように紹介されています。
Goは素早く機械語にコンパイルされます。
この優秀なコンパイルのおかげで、プログラミング中にもあまり手が止まることなく開発・動作確認を行うことができ、スペックが低いPCでも開発することができます。使用するIDE(※)によってはPCに負荷がかかりますので、動作があまりにも遅い場合は軽いエディタに乗り換えるのも1つの手段でしょう。
※IDE(Integrated Development Environment)・・・日本語で「統合開発環境」ともいわれる開発用のソフトウェアです。誤字チェックやテスト、メソッドの自動生成など様々な機能が組み込まれていますが、高機能な分テキストエディタに比べて起動や動作が重くなります。
ライブラリは豊富だが、不便さも残る
ライブラリとは、開発でよく使う機能のまとまりのようなものです。ライブラリに用意されている機能を自分のアプリケーションに組み込むことでその機能を実現できるため、開発コストを削減できます。
Goをインストールした際にデフォルトで入っているスタンダードライブラリには色々な物があります。例えばnet/httpパッケージでリクエストを受け付けて、クライアントにレスポンスを返したりできます。
他にも暗号化用のcryptoパッケージや、データベースと接続するためのdatabaseパッケージなどが標準で入っています。もちろんスタンダードライブラリをさらに便利にした各種ライブラリも存在します。
例えば、gorpというライブラリを使用するとデータベースとの接続やクエリの送信をさらに便利に実装することができます。ソフトウェア開発の世界的プラットフォームであるGitHub(https://github.com/)には様々なライブラリがアップされていますので、ぜひ探してみてください。
並行処理を実装できる
そもそも並行処理がどんなものかというと、1人で家事・掃除・仕事をこなすような処理です。1人しかいないので全てを同時に行うことは出来ませんが、煮物を煮ている間に床の掃除をし、床の掃除が終わったら(煮物を煮ている間は)仕事に取り掛かる・・・というようにスイッチしながら処理していくイメージです。
並行処理と似たもので並列処理というものがありますが、こちらは物理的に人数が増えたようなものです。お手伝いさんを頼んで、3人でそれぞれ家事・掃除・仕事を処理していきます。
並行処理・並列処理は似ていますが、根本は異なる処理です。Go言語ができるのは、1人で処理する「並行処理」です。
Go言語の学び方
まずは変数・定数・関数・メソッドなどの用語を学ぼう
Go言語を学ぶためには、まずプログラミングの基礎知識を理解しておく必要があります。
例えば、
- 変数
- 定数
- 関数・メソッド
などです。
まず、変数についてです。変数というのは入れ物のようなものです。
var hogehoge のような形で宣言することで初めて使用できるようになります。Go言語では宣言時にデフォルトの値が格納されるようになっています。
例えば文字列で変数を宣言した場合、var fuga string としておきます。そうすると別の場所でこの変数を呼び出した時、中には空文字が入っています(空文字というのは””とあらわされるものです。中に何か文字が入っているときは”文字が入っていますよ”のように表示されます)。
次に定数についてですが、定数というのは書き換えができない値です。変数は何度でも書き換え(更新)ができますが、定数は宣言時に入れられた値をずっと持ち続け、その値を更新することはできません。
これは、変更されたくない値に対してよく使われます。
最後が関数・メソッドです。関数というのは処理のまとまりで、この関数の中で変数同士をかけ合わせたり、httpレスポンスを返したりします。
戻り値を返すのもこの関数・メソッドです。関数とメソッドには大きな違いがあり、それは「構造体」と紐づいているか?というものなのですが、少し複雑なのでざっくり言ってしまうと、
- 構造体というデータのまとまりと紐づいていればメソッド
- 紐づいていなければ関数
といった感じでしょうか。Go言語の公式サイトも記載しておきますので、気になる方は見てみてください。
構造体とレシーバ、というものを理解するのに少し時間がかかるかもしれません。挫けそうだったら、まずは無視して他の箇所から学んでいくといいかもしれません。
メソッドについて:https://go-tour-jp.appspot.com/methods/1
変数などの用語が理解できたらA Tour Of Goをやってみよう
先程もURLを記載しましたが、Go言語にはA Tour Of Goという公式チュートリアルがあります。変数とは・定数とはといったような基礎的な勉強にはあまり向いていないかもしれませんが、Go言語の基礎文法を学ぶことができます。
例えば関数の宣言の仕方や、変数の宣言の仕方(変数宣言と代入の方法が複数あります)などから、並行処理まで学ぶことができます。1つ1つのボリュームはかなり小さくまとめられているので、少しずつ進めてみるといいでしょう。
まとめ
今回はGo言語の5つの特徴についてご紹介しました。Go言語について、理解が少しでも深まったでしょうか?
今も新しいバージョンがリリースされ、さらに進化していくと期待できる言語です。興味が湧いてきたら、ぜひ一度開発してみてくださいね!