Goの組込コレクション機能mapを学ぶ
Goには、アクセスのキーとなる値とその実体(バリュー)とをひもづけるコレクション機能として、「map」が存在する。言語仕様がシンプルなGoでは、予約語(キーワード)(*2)の数は25と少ない。その数少ない予約語は、if、forなど基本的な制御構造を表すキーワードなどから成るが、「map」も予約語に含まれている。すなわち、コレクション機能mapはライブラリではなく、組込の機能として提供されている。
前回、Person構造体の定義において、「フィールド名:値」という組み合わせで、フィールドを一括定義する便利な記法(複合リテラル)を学んだ。mapでも、これと類似した「Key:Value」というリテラル記法(以下)によって、容易に定義することができる。
map [キー(key)の型名] バリュー(value)の型名{ Key1:Value1, Key2:Value2, ・・・ }
簡単な例を見てみよう。
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の例を見てみよう。
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によって表示している。
2/3 |
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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|