構造体とメソッドの定義
続いて、構造体を見ていこう。Goの構造体は、Cなどと同様に、複数の変数を束ねるオブジェクトを作成する目的で使うことができる。
ただし、Goでは、構造体とひも付いたメソッドを定義できるほか、いわゆるMix-in的なオブジェクト指向プログラミングを行うためにも活用することができる。
では、構造体を用いたサンプルを見ていこう。
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) }
北島二郎です。 演歌一筋で生きてます。
順に確認していきたい。構造体は、以下の形式で定義する。
ここでは、型名をPersonとし、実体部分に、nameとmesgという2つのプロパティ(属性)を、それぞれstring型として定義している。
続いて、Person型のメソッドGreetを以下の形式で定義している。
funcキーワードの後の(this *Person)という部分は、funcで定義される関数のレシーバ(所属先)を指定している。これにより、このGreet関数はPerson型に所属するメソッドとなる。
また、*Personという表記はPerson型へのポインタを意味している(Goにおけるポインタの扱いの詳細については、Goのメモリモデルとともに述べることとしたい)。
ここでは、*Personというポインタにthisという変数名を与えている。これにより、構造体それ自体をthisという名前で参照できるようになる。そのため、メソッドGreetでは、「this.name」という記述で、Person型のnameプロパティを参照できている。
GoでもPerson型のプロパティとメソッドを持たせることができる(オブジェクト指向用語の「カプセル化」)。ただし、JavaなどClassキーワードを用いるオブジェクト指向言語に日ごろ親しんでいる方の中には、structキーワードを用いたカプセル化の表現手法に違和感を覚える方もいるだろう。
実のところ、構造体にプロパティとメソッドを導入するGoのスタイルは、Classキーワードを用いたクラス定義から機械的に変換することが可能である。そこで、筆者は、Classキーワードを用いたJava風の定義から、対応するGoの構造体を自動生成するスクリプトを作成し、用いている。
こちらは、現在、Goオブジェクトのシリアライズ・永続化を含めたスクリプト群として整備中である。整理がつき次第、本連載で紹介することとしたい。
main関数内では、定義された構造体Person型から、newキーワードを用いて、オブジェクトobjを生成している。次いで、obj.Greet( )の形式で、メソッドGreet( )を呼び出し、obj.mesgの形式で、プロパティmesgを参照している。このあたりは、ほとんど問題がないだろう。
今回は、switch文と構造体を扱った。次回は、構造体の理解を深め、Go流のオブジェクト指向プログラミングに欠かせない、interfaceによるダックタイピングの解説を行いたい。
2/2 |
Index | |
Goのswitch文で解くFizzBuzz問題と構造体のイントロ | |
Page1 goroutine以外の並列処理アプローチについての議論 switch文でFizzBuzz問題 |
|
Page2 構造体とメソッドの定義 |
新世代の並列処理言語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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|