メモ未整理
- 値を捨てる時は _ (ブランク識別子)を使う
- %vでオブジェクトのフォーマットされた内容を出力、%bで2進数(Rubyとかと同じ)
- 浮動小数はfloat32やfloat64を使用。基本はfloat64を使えばおk
- 複素数を扱う時はcomplex64やcomplex128を使う。虚数リテラルは1iのように書く。
文字列
- UTF-8エンコードされたUnicodeコードポイント(ルーン)の列。
+
で文字列結合可能。
- 値は不変。新たな文字列を変数に代入することはできるが、文字列内に含まれるバイト列は変更不可能。
s[0] = '0'
とかできない
- 値が不変ということは複製してメモリを共有しても安全。
- 比較はバイトごとに実施。
<
や >
の比較結果は辞書順。
- rangeを文字列に使うとUTF-8のデコードを暗黙的に行なっている。
- 文字列関連のパッケージで主流なものはbytes、strings、strconv、unicode。
strconv.ParseInt("123", 10, 64)で基数は10で、第3引数はint64を示す。
strconv.Atoi("123")`でintに変換
演算子
2項演算子 ( 優先順位順)
* / % << >> & &^
+ - | ^
== != < <= > >=
&&
||
- 上記と複合代入演算子がある
- Goの剰余の符号は被除数の符号と常に一緒。-5/2→-2、-5/-2→-2、--5%2→-1、-5%-2→1
- &^はAND NOT(ビットクリア)
- NaN(Not a Number)はnan。0徐算などの結果が含まれる。nanとの等号演算は必ずfalse(nan==nanも)。判定にはmath.IsNaNを使う。
- 浮動小数の関数で失敗する場合は2つ目の返り値で成功失敗を返すのが無難。
>>
は算術シフト。シフトした部分には符号が入る。
AND NOT
「x &^ y」の結果は以下の通り
X |
Y |
結果 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
y=1なら結果は0で、それ以外はxのまま
Printf
fmt.Printf("%d %[1]c %[1]q\n", 'a') // 97 a 'a'
fmt.Printf("%d %[1]c %[1]q\n", '国') // 22269 国 '国'
%qでクォート、dでASCIIコード、またはUnicodeコードポイント。