Go とは?

Go

Go最新情報

NRIのOpenStandiaが提供するGo最新情報

OSSの保守サポートサービスの内容はこちら OSSの導入については、こちらのフォームからお問い合わせ下さい OSS全般の事例紹介はこちら

Goバージョンアップ情報

すべてを見る

更新日:2021-02-18

Goの概要

Goは2009年にGoogle社からオープンソースとして発表されたプログラム言語です。既存の静的型付けプログラム言語の利点と、動的型付けプログラム言語の利点を併せ持つ比較的新しいプログラム言語です。

2009年以前、Google社においてサーバーを実装するプログラムは静的型付け言語であるC++、Javaが主流でした。これらの言語は、効率的なコンパイル、効率的な実行、プログラムの容易さ、の3つすべてを満たすものではありませんでした。また、安全性や効率性よりもプログラムの容易さを選ぶプログラマーは、動的型付けのインタプリタ言語(Python、JavaScriptなど)を選んでいました。このような背景から、双方のプログラム言語の長所を生かした新しいプログラム言語が求められるようになり、Goという新しい言語の開発が始まりました。

Goの主な設計方針は、可能な限り効率的で、安全で、流暢なプログラム言語にすることです。Goでは、コード上の無駄な記述や複雑性の削減が積極的に行われています。C言語のような前方宣言やヘッダファイルは必要なく、宣言は1度きりです。また、単純化のためC++ やJavaのような型階層やジェネリクス、例外処理、アサーション、オーバーロードがありません。

新しい言語ですが、既に多くの企業で利用されています。特に、仮想コンテナのDocker や、コンテナオーケストレーションシステムの Kubernetes は Go で実装されており、十分な稼動実績があります。

TOPに戻る

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によるエラーから処理を復帰させることができます。

TOPに戻る

Goの動作環境

公式サイトで提供されているバイナリは、以下OS/アーキテクチャで利用可能です。これ以外の OS やアーキテクチャで利用する場合は、ソースからのインストールが必要になります。

OS アーキテクチャ 備考
FreeBSD 10.3 以降
  • x86
  • x86_64
Debian GNU/kFreeBSD はサポートされません。
Linux 2.6.23 以降
  • x86
  • x86_64
  • armv6
  • armv8
  • s390x
  • ppc64le
CentOS/RHEL 5.x はサポートされません。その他のlibcで利用するためには、ソースからのインストールが必要です。
macOS 10.12 以降
  • x86_64
cgo サポートのために Xcode の導入が必要です。clang や gcc を使う必要があります。
Windows 7 以降
Windows Server 2008R2 以降
  • x86
  • x86_64
cygwin や mysys ではなく、MinGW の gcc を使う必要があります。

TOPに戻る

類似の機能をもつOSS

Goは多くの言語のアイデアを参考にして作られておりますが、特に関連があるプログラム言語は以下のとおりです。

  • Cファミリー(基本構文に関して)
  • Pascal / Modula / Oberon ファミリー(宣言、パッケージに関して)
  • Newsqueak / Limbo (同時実行性に関して)

TOPに戻る

Goのライセンス

Goは、BSDライセンスの元で配布されています。無保証であることの明記と著作権およびライセンス条文の表示を条件に、自由な改変・頒布が認められています。

TOPに戻る

Goの公式サイト

https://golang.org/

TOPに戻る

Goのダウンロードサイト

https://golang.org/dl/

TOPに戻る

Goのサポート

NRIではお客様のご要望に応じて様々な支援ができるサービスをご用意しました。
詳細は下記ページをご確認ください。

TOPに戻る

OpenStandiaに関する
資料請求・お問い合わせはこちら

  • 資料請求
  • お問い合わせ

※定期的にメンテナンスを実施しておりますが、一部情報が古い場合がございます。ご了承ください。

  • OpenStandiaサポート対象オープンソース|50種類以上のOSSのサポートをご提供します。
  • 人気midPoint
  • 人気Keycloak
  • 注目MongoDB
  • ForgeRock AM(OpenAM)
  • ForgeRock IDM(OpenIDM)
  • MongoDB
  • Postfix
  • Apache HTTP Server
  • ZABBIX
  • PostgreSQL
  • Apache Struts
  • Apache Kafka
  • Apache Hadoop
  • Apache Spark
  • Spring Framework
  • Apache Tomcat
  • Solr
  • iBATIS
  • DRBD
  • MySQL
  • JBoss
  • Ruby on Rails
  • Jaspersoft
  • OpenLDAP
  • Apache log4j
  • Apache Subversion
  • ForgeRock DS(OpenDJ)
  • Pacemaker
  • Samba
  • Red Hat Enterprise Linux
  • Nginx
  • BIND
  • Dovecot
  • Pentaho
  • sendmail
  • Courier-IMAP
  • ForgeRock DS(OpenDJ)
  • Heartbeat
  • Hibernate
  • Hinemos
  • MyBatis
  • MySQL Cluster
  • Apache Axis2
  • Squid
  • OpenSSO