Golangメモ
packageによって構成される
大文字で始まる名前はエクスポートされ、それ以外の名前はエクスポートされない
名前付き戻り値
naked return -> 短い関数以外で使うと読みづらい
:= はたぶんvarとおなじでつかえるばしょが関数内になるだけ
定数はconstで宣言する
いまのところ組み込み型しか出てきていないのでimmutabilityとかはわからない
とおもったら、character boolean numeric stringでしかつかえないらしい
Numeric Constantsよくわからない。数値の定数は高精度な値で、状況によって必要な型を取る、とある。
1 << 100 ->int64に入らないはずなのにfloatにすると計算できている??
Error handlingの仕組みがJavaとは全く異なる
例外を投げるのではなく、関数の戻り値にerror変数が設定される
errorではない場合にはnilが設定される
PointerはあるけどPointer演算はない(C言語とは異なる。)
p = &i //iのポインタ
*p = 42 //ポインタを通してiの値を設定する
*pという操作 をdereferenceとかindirectingと呼ぶ
Struct
Arrays
n <T> 型が、Tという方の長さnの配列を表す
Arraysは固定長だが、Sliceは可変長
<> Tが型Tのsliceを表す
Sliceは配列への参照のようなもので、どのようなデータも保持していない
よって、スライスで書き換えをすると元の配列も書き換えられるし、同じ配列を参照する他のスライスも書き換えられる。
Sliceにはlengthとcapacityがある
長さはsliceの長さで、容量は「元になっている配列」の範囲内でどこまで右に伸ばせるか
runtime error: slice bounds out of range :5 with capacity 4
スライスのゼロ値は nil
ゼロ値とは初期化しなかったときに代入される値のことだったはず
append関数でsliceに値を追加できる
元の配列の容量を超えてしまう場合は自動的に新しい配列を割り当て直す
ということは実質的にJavaのArrayListのように使うことができる?
Range - sliceやmapを一つずつ処理するために使う
Goの関数はClosureです
クロージャは、それ自身の外部から変数を参照する関数値です。
Goには、クラス( class )のしくみはありませんが、型にメソッド( method )を定義できます。
レシーバを伴うメソッドの宣言は、レシーバ型が同じパッケージにある必要があります。 他のパッケージに定義している型に対して、レシーバを伴うメソッドを宣言できません (組み込みの int などの型も同様です)。