Go情報
Go情報更新日:2023/08/22
Goとは
Goは2009年にGoogle社からオープンソースとして発表されたプログラム言語です。既存の静的型付けプログラム言語の利点と、動的型付けプログラム言語の利点を併せ持つ比較的新しいプログラム言語です。
2009年以前、Google社においてサーバーを実装するプログラムは静的型付け言語であるC++、Javaが主流でした。これらの言語は、効率的なコンパイル、効率的な実行、プログラムの容易さ、の3つすべてを満たすものではありませんでした。また、安全性や効率性よりもプログラムの容易さを選ぶプログラマーは、動的型付けのインタプリタ言語(Python、JavaScriptなど)を選んでいました。このような背景から、双方のプログラム言語の長所を生かした新しいプログラム言語が求められるようになり、Goという新しい言語の開発が始まりました。
Goの主な設計方針は、可能な限り効率的で、安全で、流暢なプログラム言語にすることです。Goでは、コード上の無駄な記述や複雑性の削減が積極的に行われています。C言語のような前方宣言やヘッダファイルは必要なく、宣言は1度きりです。また、単純化のためC++ やJavaのような型階層やジェネリクス、例外処理、アサーション、オーバーロードがありません。
新しい言語ですが、既に多くの企業で利用されています。特に、仮想コンテナのDocker や、コンテナオーケストレーションシステムの Kubernetes は Go で実装されており、十分な稼動実績があります。
主な特徴
|
フォーマット
|
-
gofmt コマンドもしくはgo fmt コマンドにより、コードを自動フォーマットできます。
|
|
コメント
|
-
C++やJavaと同様に、/* */ でブロックコメント、// で行コメントとなります。コードの変数や関数上に適切なコメントを挿入することで、godoc コマンドによりドキュメントが生成されます。
|
|
ネーミング
|
-
パッケージ名は慣例として、英単語1語で設定します。大文字小文字の混在した複数語や、アンダースコアは使いません。
-
パッケージ外から参照される変数/関数のネーミングは先頭文字を大文字にするのがルールです。このルールによってアクセス制御が行われるため、アクセス識別子(private、publicなど)がありません。また、ゲッター/セッターは自動サポートされません。
-
ひとつのメソッドだけを持つインターフェースには、そのメソッド名の後ろに "er" をつけた名前にするのが慣例です。つまり、Read というメソッドのインターフェース名はReader というインターフェースとします。
|
|
セミコロン
|
|
|
制御機構
|
-
:= により、型の指定なく変数を宣言できます。
-
if や、for の条件式に () を必要としません。
-
do-while や、while ループがありません。すべて for で記載できます。
-
switch の各 case 文でbreak の必要がありません。自動的にbreak が行われます。
-
チャネル変数を使った実行制御ではselect ... case 文が使われます。
|
|
関数
|
-
複数の戻り値に対応しています。
-
defer 文により、関数の終了後に処理を実行させることが可能です。ミューテックスのロック解除や、ファイルのクローズなどに利用されます。
|
|
データ
|
-
メモリ割り当ては、new関数、もしくはmake関数によって行われます。
-
new関数はゼロ化のみで利用できる型(bytes.Buffer や、sync.Mutex)で使われます。
-
make関数は配列のスライスやマップ、チャンネルを作成する場合のみに使われます。
-
ゼロ値だけでは利用できない型はコンストラクターによる初期化を利用します。Goでのコンストラクターとは、型のポインタを返すNew{型名} という関数のことです。
-
fmtパッケージを利用することで、型に応じて様々なフォーマットで出力することが可能です。
|
|
初期化
|
-
通常の定数、変数の定義に加え、init 関数が利用できます。init 関数を使うことで、プログラムが実行される前に、パッケージ変数の妥当性を検証することが可能です。
|
|
メソッド
|
-
クラスの仕組みはありませんが、任意の型にメソッド(レシーバ引数を伴う関数)が定義できます。これはいわゆる、メソッドのオーバーライドになります。
-
メソッドにポインタレシーバ引数を利用することで、レシーバ内の変数の変更やメモリの節約ができます。
|
|
インターフェース
|
-
他の言語と同様、複数のインターフェースを実装できます。ただし、C++や、Javaのように実装しているインターフェースを明示する必要がありません。
-
空のインターフェースで定義した変数には任意の型の代入ができます。変数の型を判別する処理(型アサーション)などで利用されます。
-
引数や戻り値にインターフェース型を指定して、特定の型に依存しない処理を実現することが可能です。
|
|
ブランク識別子
|
-
複数の戻り値があるが片方しか使用しない場合(rangeによるループやインターフェースチェックなど)や、未使用の変数があるが開発中はデバッグとして残しておきたい場合などに、"_"(ブランク識別子)の利用できます。
|
|
組み込み
|
-
Goにはクラスの継承関係はありませんが、構造体変数に別の構造体や複数のインターフェースを組み込むことで、複数のインターフェースをもつ型を簡単に定義でき、組み込んだ変数に処理を委譲することができます。
|
|
同時実行制御
|
-
goroutine(Goルーチン)を利用することで、関数を簡単に非同期実行させることができます。go {関数名} と呼ぶだけです。
-
チャネル型変数を利用することで、goroutine 間でデータを共有したり、非同期実行された処理の完了を待ったり、セマフォとして利用したりすることができます。
|
|
エラー制御
|
-
関数で複数の戻り値を返すことが可能なので、単純なエラー値でなく、エラーに応じた詳細なコンテキストを返すことができます(Goでは、error インターフェースを実装することを推奨)。
-
panic 関数により意図的にエラーを発生させたり、recover 関数によりpanicによるエラーから処理を復帰させることができます。
|
同様の機能を提供する商用製品
Goは多くの言語のアイデアを参考にして作られておりますが、特に関連があるプログラム言語は以下のとおりです。
-
Cファミリー(基本構文に関して)
-
Pascal / Modula / Oberon ファミリー(宣言、パッケージに関して)
-
Newsqueak / Limbo (同時実行性に関して)
動作環境
公式サイトで提供されているバイナリは、以下OS/アーキテクチャで利用可能です。これ以外の OS やアーキテクチャで利用する場合は、ソースからのインストールが必要になります。
|
OS
|
アーキテクチャ
|
|
FreeBSD
|
|
|
Linux
|
-
x86
-
x86-64
-
ARMv6
-
ARM64
-
s390x
-
ppc64le
|
|
macOS
|
|
|
Windows 7 以降
|
|
参考: https://go.dev/dl/
Goのライセンス
Goは、BSDライセンスの元で配布されています。無保証であることの明記と著作権およびライセンス条文の表示を条件に、自由な改変・頒布が認められています。
オープンソース年間サポートサービス
OpenStandiaではOSSを安心してご利用いただけるように、オープンソース年間サポートサービスをご提供しております。
サポートしているOSSは下記ページをご参照ください。