新世代の並列処理言語Google Goをひもとく

第6回 Goでドメイン特化言語も作成可能!?

赤坂 けい
チームWordProgress

2010/4/19

Goの組込コレクション機能mapを学ぶ

 Goには、アクセスのキーとなる値とその実体(バリュー)とをひもづけるコレクション機能として、「map」が存在する。言語仕様がシンプルなGoでは、予約語(キーワード)(*2)の数は25と少ない。その数少ない予約語は、if、forなど基本的な制御構造を表すキーワードなどから成るが、「map」も予約語に含まれている。すなわち、コレクション機能mapはライブラリではなく、組込の機能として提供されている。

[*2]予約語とは、おおよそ、「識別子(変数名、関数名、クラス名など)として使うことが禁止されている語句」といった意味である。

 前回、Person構造体の定義において、「フィールド名:値」という組み合わせで、フィールドを一括定義する便利な記法(複合リテラル)を学んだ。mapでも、これと類似した「Key:Value」というリテラル記法(以下)によって、容易に定義することができる。

    map [キー(key)の型名] バリュー(value)の型名{ 
        Key1:Value1,
        Key2:Value2,
        ・・・
    }

 簡単な例を見てみよう。

●map1.go
package main
var M1 =  map [int] string{
    1:"いち",
    2:"に",
    3:"さん",
  }
  
func main() {
    for key, value := range M1 {println(key,value)}
}
●実行結果
3 さん
1 いち
2 に

 ここでは、int型のキーとstring型のバリューを持つmapを定義し、変数名M1を割り当てている。main関数においては、PHPやC#のforeach、Javaの拡張forと同様の機能を有する「rangeキーワードを用いたfor」を用いて、M1の内容を表示している。すなわち、「for key,value := range M1{ ・・ }」という表記でマップM1からrangeを介して、キーを変数keyに、バリューを変数valueに割り当てている。実行結果を見て分かる通り、mapでは、データの順序は保証されない(順序を揃えたい場合には、配列などを用いる。このあたりは、本連載第2回で取り上げている)。

 続いて、string型のキーとstring型のバリューを持つmapの例を見てみよう。

●map2.go
package main
import ("fmt")
// パッケージ内で共通に用いる変数の宣言
var num int;
//mapの内容を表示するための関数show
func show(m map[string] string)  {
    num += 1;
    fmt.Printf("●会員番号%d\n",num);
    for key,value := range m{
        fmt.Printf("・%sは、%s\n",key,value)
    };
    println();
}
//main関数
func main() {
  m1 :=   map [string] string{
    "氏名":"武田珍念",
    "出身大学":"山梨大学仏教学部",
  };
  m2 :=   map [string] string{
    "氏名":"上杉献身",
    "出身大学":"聖隷新潟大学看護学部",
    "取得免許":"看護師"
  };
  m3 :=   map [string] string{
    "氏名":"ダンテ政宗",
    "出身大学":"仙台大学スキー学部",
    "出身国":"イタリア"
  };
  
  show(m1);
  show(m2);
  show(m3);
}
●実行結果
●会員番号1
・出身大学は、山梨大学仏教学部
・氏名は、武田珍念
●会員番号2
・取得免許は、看護師
・出身大学は、聖隷新潟大学看護学部
・氏名は、上杉献身
●会員番号3
・出身国は、イタリア
・出身大学は、仙台大学スキー学部
・氏名は、ダンテ政宗

 ここでは、1つのmapに1人分の名簿情報という意味を持たせている。いささか原始的な例だが、mapのリテラル表記を用いると、気軽にコレクション・データが定義できることが分かるだろう。定義したmapデータは、先程と同様に、for〜rangeによって表示している。

prev
2/3
next
Index
Goでドメイン特化言語も作成可能?
  Page1
GoでDSL(ドメイン特化言語)?
  Page2
Goの組込コレクション機能mapを学ぶ
  Page3
任意の型を格納可能なinterface{}
おわりに

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間