Goの勉強 コンポジット型

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)  
    
    • {{.}} で現在の要素のアクセスできる
    • {{range}} {{end}} でループ
    • めちゃくちゃ使いづらい
      • JSやPHPに比べると面倒
      • IDEが補完してくれない
  • HTMLテンプレートを使うことでエスケープをしつつ文字列に変数を埋め込むことができる
    • 変数の型を template.HTML にすることで、エスケープなしで出力することができる