Goの勉強をやり始めたのでメモ。
「プログラミング言語 Go」を読んでる。
配列
- 固定長で型が同じ必要がある
以下のように宣言できる
var a [5]int var b [5]int{1, 2, 3, 4, 5} var c [...]int{1, 2, 3, 4, 5} var d [...]int{99: -1}
- 初期値がない場合はそれぞれの要素にゼロ値が適用される
==
で比較可能- 関数の引数として配列を渡すと、参照ではなくコピーが渡される
スライス
- 可変長で型が同じ必要がある
- スライスにはポインタ、長さ、容量がある
- 配列の部分配列みたいなもの
- スライスには基底配列がある
以下のようにスライスを生成すると同じサイズの基底配列が自動的に生成される
s := []int{0, 1, 2, 3, 4, 5}
- スライスは
==
で比較不可能slice == nil
のみ比較可能- ただし、空かどうかを調べたい場合は
len(slice) == 0
を使う
- ただし、空かどうかを調べたい場合は
- スライスのゼロ値は
nil
make
を使用すると型、長さ、容量を指定してスライスを生成できるappend
を使うことでスライスに値を追加できるappend
した結果の基底配列が、元のスライスの基底配列と同じかどうかはわからない
マップ
- ハッシュテーブル
- キーと値はそれぞれで型を指定する必要がある
- キーの型は
==
で比較可能でなければならない- 精度や
NaN
があることから、float
系をキーで使うことは推奨されない
- 精度や
以下のように作成できる
go m := make(map[string]int) var m map[string]int{ "taro": 11, "jiro": 8, }
delete
を使用して要素を削除できる- 存在しないキーにアクセスするとゼロ値が返る
マップに要素が存在するかについては以下のようにチェックする
item, ok := m["saburo"] if !ok { // ... }
- マップの要素のアドレスを取得することはできない
- マップをループした際の取得順はランダムになる
構造体
type Student struct { ID int Name string }
のように宣言できる。
- 名前付き構造体は自身のフィールドに同じ型のフィールドを持てない
- 持ちたい場合は自身の型のポインタを使う
- 空構造体
struct{}
を使う人もいるが、筆者はあまり好きではないらしい - すべてのフィールドが比較可能であれば、構造体も比較可能である
- よって、マップのキーに構造体を指定することもできる
- 無名フィールドを使うことで、ネストされた構造体でも短いドットでアクセスできる
- デリゲーションみたいなイメージ?
- ただし、本当に無名ではなく、暗黙的に無名フィールドの型名と同じ名前が割り当てられている
フィールドタグを付けることで、メタデータを付与することができる
type Movie struct { Year int `json:"released"` }
- 慣習的に
key:"value"
の形式で書く - JavaDocみたいな感じかな
- 慣習的に
テンプレート
テキストテンプレートを使うことで文字列に変数を埋め込むことができる
const templ = `合計{{.TotalCount}}件 --- {{range .Items}} ID: {{.ID}} Title: {{.Title}} {{end}} ` text, err := template.New("text").Parse(templ) err := text.Execute(os.Stdoutm items)
- HTMLテンプレートを使うことでエスケープをしつつ文字列に変数を埋め込むことができる
- 変数の型を
template.HTML
にすることで、エスケープなしで出力することができる
- 変数の型を