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

第4回 Goのswitch文で解くFizzBuzz問題と構造体のイントロ

赤坂 けい
チームWordProgress

2010/2/25

構造体とメソッドの定義

 続いて、構造体を見ていこう。Goの構造体は、Cなどと同様に、複数の変数を束ねるオブジェクトを作成する目的で使うことができる。

 ただし、Goでは、構造体とひも付いたメソッドを定義できるほか、いわゆるMix-in的なオブジェクト指向プログラミングを行うためにも活用することができる。

 では、構造体を用いたサンプルを見ていこう。

●struct1.go
package main
import ( "fmt" )

// Person型の定義
type Person struct {
    name string;
    mesg string;
}

// Personをレシーバとするメソッドの定義
func (this *Person) Greet(){ 
    fmt.Printf("%sです。\n",this.name)
}

func main() {
    //オブジェクトの生成
    obj := new (Person);
    obj.name ="北島二郎";
    obj.mesg ="演歌一筋で生きてます。";
  
    //メソッドGreet()の実行と、プロパティmesgの表示
    obj.Greet();
    println(obj.mesg)
}
●実行結果
北島二郎です。
演歌一筋で生きてます。

 順に確認していきたい。構造体は、以下の形式で定義する。

type 型名 struct { 定義の実体 }

  ここでは、型名をPersonとし、実体部分に、nameとmesgという2つのプロパティ(属性)を、それぞれstring型として定義している。

 続いて、Person型のメソッドGreetを以下の形式で定義している。

func (this *Person) 関数名 ( 引数 ) { 実体 }

 funcキーワードの後の(this *Person)という部分は、funcで定義される関数のレシーバ(所属先)を指定している。これにより、このGreet関数はPerson型に所属するメソッドとなる。

 また、*Personという表記はPerson型へのポインタを意味している(Goにおけるポインタの扱いの詳細については、Goのメモリモデルとともに述べることとしたい)。

 ここでは、*Personというポインタにthisという変数名を与えている。これにより、構造体それ自体をthisという名前で参照できるようになる。そのため、メソッドGreetでは、「this.name」という記述で、Person型のnameプロパティを参照できている。

 GoでもPerson型のプロパティとメソッドを持たせることができる(オブジェクト指向用語の「カプセル化」)。ただし、JavaなどClassキーワードを用いるオブジェクト指向言語に日ごろ親しんでいる方の中には、structキーワードを用いたカプセル化の表現手法に違和感を覚える方もいるだろう。

筆者も、オブジェクト指向プログラミングではClassキーワードを用いたいと思っている(オブジェクト指向は、特にチーム開発で本領を発揮するため、JavaやRubyなどに慣れ親しんだプログラマにとって違和感の少ない表記法を用いることが望ましいと考えている)。

実のところ、構造体にプロパティとメソッドを導入するGoのスタイルは、Classキーワードを用いたクラス定義から機械的に変換することが可能である。そこで、筆者は、Classキーワードを用いたJava風の定義から、対応するGoの構造体を自動生成するスクリプトを作成し、用いている。

こちらは、現在、Goオブジェクトのシリアライズ・永続化を含めたスクリプト群として整備中である。整理がつき次第、本連載で紹介することとしたい。

 main関数内では、定義された構造体Person型から、newキーワードを用いて、オブジェクトobjを生成している。次いで、obj.Greet( )の形式で、メソッドGreet( )を呼び出し、obj.mesgの形式で、プロパティmesgを参照している。このあたりは、ほとんど問題がないだろう。

 今回は、switch文と構造体を扱った。次回は、構造体の理解を深め、Go流のオブジェクト指向プログラミングに欠かせない、interfaceによるダックタイピングの解説を行いたい。

prev
2/2

Index
Goのswitch文で解くFizzBuzz問題と構造体のイントロ
  Page1
goroutine以外の並列処理アプローチについての議論
switch文でFizzBuzz問題
  Page2
構造体とメソッドの定義

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

 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 記事ランキング

本日 月間