パッケージ
- 同じパッケージに属するなら、そのパッケージ内で変数や関数を参照できる。
- つまりパッケージとは1つのファイルを複数に分割する仕組み。
文字列
- Goの文字列はかなり特殊なので挙動に注意する。
- イミュータブル。
- 値型なのに関数の引数に渡してもコピーがされない。
- だからポインタがいらない。
マップ
- マップは存在しないキーを指定すると初期値が返ってきてしまう。
- これを防ぐために引数を2つ受け取り、エラーハンドリングを行う。
m := map[int]string{ 1: "A", 2: "B"}
if _, ok := m[1]; ok {
}
チャネル
- チャネルとはゴルーチン間でデータを共有する仕組み
- チャネルから受信する=他のゴルーチンからデータが来るのを待つ
- 双方向のチャネルは受信専用・送信専用、どちらの型にも代入できる
構造体
- Goの構造体は省略記法として、ポインタと実態を気にすることなくメソッドを呼び出せる。値も代入できる。
- 構造体に定義するメソッドのレシーバは原則ポインタ型にする。そうしないと破壊的変更ができない。
- 構造体のフィールド(キー・インスタンス変数みたいなやつ)は初期値を持っている。
フィールド名 型名
が同じときはJSのオブジェクトと同じ省略記法が使える。
- 省略記法を使うと、
hoge.huga.name
をhoge.name
のように階層を飛ばしてアクセスできる。
値型と参照型
- Goの型は値型と参照型に分類される。値型は関数の引数として渡すとき、コピーとして渡されてしまう。値型を参照渡しとして破壊的変更を関数内で行うためには、ポインタを使う。
- 参照型はスライス、マップ、チャネルの3つのみ。自分で定義する独自型も含めて、他は全て値型となる。
- スライス、マップ、構造体では構造体の型名を省略できる。
m := map[int][]string {
1: {"hoge"},
2: {"huga", "piyo"}
}
独自型
type (定義する型) (既存の型)
のような文法。
- 独自型を作ったり既存の型にエイリアスを与えることができる。
インターフェース
- インターフェースとは「異なる型に共通の性質を付与する」ための機能。ダッグタイピングと似ている。
- あるインターフェースにあるメソッドを全て実装すると、自動的にそのインターフェースに属することができる。
- インターフェースによって、第二・第三の型を与えることができる。