夢のかけら

Goエンジニアの技術ブログ

Goに入門したので備忘録を書く

パッケージ

  • 同じパッケージに属するなら、そのパッケージ内で変数や関数を参照できる。
  • つまりパッケージとは1つのファイルを複数に分割する仕組み。

文字列

  • Goの文字列はかなり特殊なので挙動に注意する。
  • イミュータブル。
  • 値型なのに関数の引数に渡してもコピーがされない。
  • だからポインタがいらない。

マップ

  • マップは存在しないキーを指定すると初期値が返ってきてしまう。
  • これを防ぐために引数を2つ受け取り、エラーハンドリングを行う。
m := map[int]string{ 1: "A", 2: "B"}
if _, ok := m[1]; ok {
  // mにはキー1が存在する
}

チャネル

  • チャネルとはゴルーチン間でデータを共有する仕組み
  • チャネルから受信する=他のゴルーチンからデータが来るのを待つ
  • 双方向のチャネルは受信専用・送信専用、どちらの型にも代入できる

構造体

  • Goの構造体は省略記法として、ポインタと実態を気にすることなくメソッドを呼び出せる。値も代入できる。
  • 構造体に定義するメソッドのレシーバは原則ポインタ型にする。そうしないと破壊的変更ができない。
  • 構造体のフィールド(キー・インスタンス変数みたいなやつ)は初期値を持っている。
  • フィールド名 型名が同じときはJSのオブジェクトと同じ省略記法が使える。
  • 省略記法を使うと、hoge.huga.namehoge.nameのように階層を飛ばしてアクセスできる。

値型と参照型

  • Goの型は値型と参照型に分類される。値型は関数の引数として渡すとき、コピーとして渡されてしまう。値型を参照渡しとして破壊的変更を関数内で行うためには、ポインタを使う。
  • 参照型はスライス、マップ、チャネルの3つのみ。自分で定義する独自型も含めて、他は全て値型となる。
  • スライス、マップ、構造体では構造体の型名を省略できる。
m := map[int][]string {
    1:  {"hoge"}, // []string{"hoge"}と同じ
    2: {"huga", "piyo"}
}

独自型

  • type (定義する型) (既存の型)のような文法。
  • 独自型を作ったり既存の型にエイリアスを与えることができる。

インターフェース

  • インターフェースとは「異なる型に共通の性質を付与する」ための機能。ダッグタイピングと似ている。
  • あるインターフェースにあるメソッドを全て実装すると、自動的にそのインターフェースに属することができる。
  • インターフェースによって、第二・第三の型を与えることができる。