Go言語(Golang)に関する世界観です。
importはパッケージのインポートであり、()で指定することで複数のパッケージをインポートできる。自分のパッケージはpackage hogepkgでパッケージ化できる。
変数はvar、定数はconstで宣言する。他の多くの言語と異なり、型名よりも変数名を先に書く。変数の初期値から型名が明らかに分かっている場合は、型名を省略できる。また、:=を用いればvarも省略できる。複数の変数は「,」で区切って横に並べれば一度に代入できる。またvarの後に()を書くことで複数の変数宣言と代入を同時にできる。
配列は要素数が固定となり、変更できない。これに対して、配列の一部あるいは全部への参照であるスライスは、要素数を変更したり、要素を追加したりすることができる。
if文、switch文、for文には条件式に()は必要ない。switch文では、caseの中に条件式を書くことができる。switch文では、breakが必要ない。意図的にフォールスルーしたい時はfallthroughを明示的に記述する。また、while文は存在せず、for文で従来のfor文に相当するループも、while相当のループも行うことができる。for文では、連続した要素をイテレータのように順番に処理したければ、rangeを用いる。
マップは連想配列やハッシュ、辞書と呼ばれるような、キーと値を対応付けたデータ構造。Pythonの辞書やJavaScriptのオブジェクトのように一覧で宣言できるほか、要素の追加や削除もできる。また、for文でrangeを用いてキーと値のどちらもを取り出したループを行うことができる。
関数はfuncで宣言する。他の多くの言語では関数はひとつの値しか返すことができないが、Go言語では複数の値を返すことができる。
Go言語には、クラスが存在しない。代わりに構造体を用いる。メソッドは、構造体とは別の場所に羅列する。この時、関数名の前に構造体の変数名と型名を、
func (構造体の変数名 構造体の型名) 関数名(x int, y int) (int int) { ... }
のように書くことで、構造体とメソッドを紐づけすることができる。また、デフォルトでは構造体の変数は値渡しとなる。これを参照渡しとしたい場合は構造体の型名に*をつける。こうすれば、構造体の中身をメソッドから変更できる。
Go言語では、意図的に継承は実装していない。しかしながら、匿名フィールドという機能を用いれば、ほかの構造体にあるフィールドやメソッドと同じものを持つ構造体を簡単に作成できる。
Go言語では、interfaceをポリモーフィズムのために使ったり、空インターフェースをany型のように使うことができる。interfaceはメソッド名の羅列であり、interfaceの中のメソッドと同名のメソッドを定義すると、interfaceを実装したことに相当する(自動的にinterfaceを適用できるようになる)。その上で、interfaceを引数とするメソッド(interfaceを引数とする汎用関数)を定義することもでき、その場合はinterfaceが実装された構造体を引数としてメソッドとして受け取ることができる。
また、空インターフェースと呼ばれるinterface{}は、すべての型と互換性があり、any型のように使用することができる。変数に対してどんな型の値も代入でき、引数として使えばどんな型の引数も受け付けることができる。
Go言語では、例外は存在しない。例外のようなことを行いたい場合はgoto文を使えばよい。
また、Go言語にはガーベッジコレクションの仕組みがあるため、newした領域は参照がなくなれば自動的に廃棄される。Go言語にはポインタも存在する。構造体名と要素を繋ぐ「.」はポインタの場合もそうでない場合も使うことができる。
以下は参考文献。
goroutineで並行処理を簡単に書ける。
package main func func1() { ... } func func2() { ... } func main() { go func1() go func2() ... }
func1()とfunc2()は並列で実行される。
また、チャネルを用いることで、goroutineの終了を待ち合せたり、別のgoroutineから値をパイプのように取り出すことができる。
僕は、ツイッターで山田ハヤオ (@Hayao0819)さんのツイートを見た結果、golangに興味が出てきたので、golangの勉強を少しずつしています。
golangは、公式のドキュメントがよく書かれていて、おすすめです。
特に、以下のドキュメントのリンクから、簡単なチュートリアルが読めます。
ですが、ある程度golangのことが分かったら、このチュートリアルは飛ばして、Effective Goを読むことをおすすめします。Effective Goは、英語が理解できなくても、眺めているだけでなんとなくgolangの基本的な雰囲気が分かるので、僕のような「触りだけを知りたい入門者」にはうってつけだと思います。
実際のgolangがどのような言語であるかは、僕の意見を知るよりも、山田ハヤオさんや@mattn_jpさんのようなさまざまなgolang界隈の方のツイートを読めば分かると思います。山田ハヤオさんはAlter LinuxというLinuxディストリビューションの開発者であり、Linuxに関する技術力には疑いようのないものがあります。
日本向けLinuxディストリビューションも参照のこと。
2023.05.04
2023.05.28編集
グーグルによる並列処理言語。
以下にサンプルコードがあります。
並列処理も参照のこと。
Go言語でRedisを使う方法については、Redisを参照のこと。