.NET開発者のためのブログメディア

Go言語とは?シンプルな記述が強みのGo言語の使用方法、特徴について解説
- SE
- Go言語はどのようなプログラミング言語なのですか。
- PM
- Googleによって開発されたオープンソースのプログラム言語です。シンプルで信頼性が高く、効率的なソフトウェア開発を実現することができるという点が特徴です。
目次
Go言語とは?
Go言語(Golangとも呼称されます)はGoogleによって開発され、2009年11月に発表されたオープンソースのプログラム言語です。Go言語はシンプルかつ信頼性が高く、効率的なソフトウェア開発を実現することができるという点が特徴です。
Go言語は汎用的に利用可能な言語ではありますが、特にWebアプリケーションのサーバーサイドの基盤や、エンジニア向けのツールやシステムを構築するのに最適な選択肢です。
サーバーサイドの言語としては非常にニーズの高まってきている言語で、特にマイクロサービスアーキテクチャに採用されるケースが多いです。
Go言語はマイクロサービスアーキテクチャに採用されやすい
前セクションでGo言語はマイクロサービスアーキテクチャに採用されやすいと述べました。そもそもマイクロサービスとはなんでしょうか。
マイクロサービスとは、1つのアプリケーションを複数のサービスに分割してアプリケーションを構成する手法です。複数のサービスで構築することによって、疎結合かつフェールセーフなアプリケーションを構築できます。
複数のサービスに分割されていることで、サービス単位での開発・デプロイ・テストを行うことができます。
特に日本では、Ruby on Railsで実装されたWebアプリケーションをマイクロサービスする際に、Go言語でリプレイスを行うという事例が近年多いです。
Go言語はコンパイルが必要な言語です
プログラム言語を大別するとコンパイルが必要な言語(コンパイル言語)と、そうでない言語(スクリプト言語)に分けられます。Go言語は前者のコンパイル言語です。 つまり、ソースコードを実行可能なバイナリ形式に変換する必要があります。
コンパイルが必要な言語としてはJavaがメジャーなプログラミング言語ですが、Javaと違ってGo言語はOS毎にコンパイルが必要です。(OS毎にコンパイルが必要な点はC言語と一緒です。)
Go言語は、Mac, Linux, Windowsを問わずに実行させることができますが、それぞれのOS毎にコンパイルを行い実行可能なファイルを用意する必要があるのです。
1 |
$ go build main.go |
Go言語は静的型付け言語です
Go言語はJavaやC言語、最近流行りのTypeScriptと同様に静的型付け言語です。(RubyやPythonは動的型付け言語です。)
静的型付け言語は宣言された変数や、関数の引数・返り値の型が予め決まっているプログラミング言語になります。
1 2 3 4 5 |
func addNumbers(x, y int) int {<br> var sum int<br> sum = x + y<br> return sum<br> } |
静的型付け言語は、予め型が決まっているため、実行時ではなくコンパイル時に型のチェックが行われます。そのため処理速度が早くなります。また、関数の引数や返り値の型が予め定まっているということで大人数での開発に適している、とも言われています。
Go言語では型推論が有効になっています
型推論とは変数の宣言時に明示的に変数の型をしてしなくても、前後の文脈を踏まえて暗黙的に変数の型が決定される仕組みのことを言います。
前セクションでは、Go言語は静的型付け言語であり、変数の宣言時に型を指定するということをお伝えしましたが、実際の開発では型を指定しての宣言はあまり使いません。なぜかと言うと、Go言語は型推論が有効だからです。
前セクションではvarを使って変数の宣言をしましたが、以下のように:=を使って宣言と代入を同時に行うことができます。
1 |
name := “SATO TARO” |
また、関数の返り値に対しても型推論は有効です。返り値がint型の関数addNumbersの左辺にsumという関数を用意します。この場合、sumはint型と推論されます。
1 |
sum := addNumbers(10, 20) |
Go言語は静的型付けであり、型推論も有効な言語なのです。
Go言語はオブジェクト指向ではありません
Go言語には”オブジェクト”と呼ばれる型はなく、インスタンスを生成して、生成したインスタンスにアクセスして…という方法を採用していません。
オブジェクト指向に慣れている方はこの点で悩まれる方が多いです。唯一オブジェクト指向に類似した仕組みとして構造体と呼ばれる仕組みが存在します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main<br> import “fmt”<br> type employee struct {<br> id int<br> name string<br> age int<br> }<br> func (e *employee) introduce() {<br> fmt.Println(“I am “, e.name)<br> }<br> func main() {<br> TanakaTaro := employee{<br> id: 4,<br> name: “TanakaTaro”,<br> age: 32,<br> }<br> TanakaTaro.introduce()<br> } |
このように、構造体に対しては関数を付加できるという仕組みが存在しています。
Go言語では並行処理が書きやすい
Go言語は並行処理がシンプルに記載できると評判が良いです。既存のプログラミング言語では並行処理の記述が複雑になりがちですが、Go言語ではそれが解消されています。
関数を呼び出す際に、先頭にgoを付与するだけで良いのです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main<br> import “fmt”<br> func main() {<br> fmt.Println(“アプリ起動”)<br> go getEmployee()<br> fmt.Println(“取得リクエスト済み...”)<br> (略) <br> }<br> func getEmployee(id int) *employee {<br> var emp employee<br> ~時間のかかる処理~<br> fmt.Println(“取得処理完了!!!”)<br> return emp<br> } |
正確に言うとmainもgoroutineの一種です。mainというgoroutineから別のgoroutineを呼ぶことができるのです。
Go言語にはポインタという概念があります
Go言語にはポインタという概念が出てきます。ポインタは簡単に言えば、変数が格納されているアドレスのことです。C言語を触ったことのある方なら馴染みがあるのではないでしょうか。
1 2 3 4 5 |
var p *Person<br> p = &Person{<br> Name: “Tanaka Taro”,<br> Age: 32,<br> } |
- SE
- シンプルで信頼性が高いというのがいいですね。
- PM
- 年々需要が高まっている言語ですので、この機会にぜひGo言語を勉強してみてください。
Go言語を取得してエンジニアとしての価値を高めよう
この記事ではGo言語の特徴について解説しました。Go言語は少し癖のある言語ではありますが、記載の仕方は非常にシンプルです。Webサーバーも数行の記述で実装することができます。
サーバーサイドの言語として年々需要が高まっている言語ですので、この機会にGo言語を勉強してみるのも良いのではないでしょうか。