型の異なるオブジェクトの連結
インターフェイスの簡単な例題として、任意のオブジェクトを「連結(単純につなげる)」させることにチャレンジしてみよう。
はじめに、準備運動代わりに、静的型言語であるGoでは、型の異なるオブジェクトは、連結・加算できないことを確かめておきたい。
なお、このままexam5-3.goをコンパイルするとエラーが表示される。
package main func main() { println("a" +"b"); println("a" +1); println("a" +1.2); }
D:\go-win\mysrc\duck>8g exam5-3.go exam5-3.go:5: invalid operation: "a" + 1 (type string + int) exam5-3.go:6: invalid operation: "a" + 1.2 (type string + float)
Goでは、ほかの多くの言語と同様に、加算記号(+)を用いて、文字列と文字列とを連結できるが、文字列と数値を直接連結させようとすると、コンパイルエラーとなる。
文字列と数値を連結する場合には、strconvパッケージのItoa関数(整数->文字列)、Ftoa関数(実数->文字列)を用いる(これらの関数名は、Cプログラマにはおなじみだろう)。
ついでに、整数と実数を足し合わせる演算はコンパイルエラーとならないことも確認しておく。
package main func main() { println(1 +3); println(1 +3.0); println(1.2 +3); }
D:\go-win\mysrc\duck>.\8.exe 4 +4.000000e+000 +4.200000e+000
初めてのインターフェイス・プログラム
これから、インターフェイスの例題として、文字列へのコンバート関数(strconv.Itoa、strconv.Ftoa)を隠蔽したメソッドStrの作成に挑戦してみたい(このサンプルプログラムはあくまで例題であり、実用性には欠ける)。
Goのインターフェイス宣言は以下のように行う。
こうして宣言されたGoのインターフェイスは「型(type)」であり、関数の引数などとすることができる。以下のサンプルプログラムで確かめておこう。
package main import ("fmt"; "strconv") //Strメソッドを持つことを条件とするtoStringインターフェイスを定義 type toString interface { Str() string } //toStringインターフェイスを引数に取る関数connectの定義 func connect (x toString, y toString) string{ return x.Str()+y.Str()} //toStringインターフェイスを満たす2つの型myIntとmyFloatを定義 type myInt int func (this myInt) get() int { return int(this) } func (this *myInt) Str() string { return strconv.Itoa(this.get()) } type myFloat float func (this myFloat) get() float { return float(this) } func (this *myFloat) Str() string { return fmt.Sprintf("%v",this.get()) } func connectTest(x toString, y toString) { fmt.Printf("%sと%sを連結してみます : %s\n",x.Str(),y.Str(),connect(x,y)) } func main() { var v myInt = 3; var f myFloat =1.2; connectTest(&v,&f); connectTest(&f,&v); }
D:\go-win\mysrc\duck>.\8.exe 3と1.2を連結してみます : 31.2 1.2と3を連結してみます : 1.23
まず、冒頭部に注目してほしい。
という形で定義されたtoStringインターフェイスが、直後で定義されている関数connectの引数となっている。
toStringインターフェイスであるxとyは、ともにメソッドStr( )を持つであろうため(この時点で、toStringインターフェイスを満たす型は存在しないにも関わらず)、関数connectはコンパイルを通る。
次の部分では、このtoStringインターフェイスを満たす2つの型myIntとmyFloatを定義している。myIntの実体はint、myFloatの実体はfloatであるが、ともにStr( )メソッドを持つ点で、int、floatとそれぞれ異なる。
そのため、myIntとint、myFloatとfloatはそれぞれ別物であり、キャスト(型変換)が必要とされる。それぞれのget( )メソッド内のint(this)、float(this)の部分がキャストである。
これらは、あらかじめ定義したconnect関数の引数とすることができる。関数が呼び出されると、それぞれのStr( )メソッドが呼び出され、両者を結合した文字列が返される。
数値から文字列への変換方法は複数ある。ここでは、myIntから文字列への変換にはstrconv.Itoa関数を、myFloatから文字列への変換にはfmt.Sprintf関数の"%v"フォーマット(文字列へとよしなに変換してくれるオプション)を用いている。実行結果そのものは、特に注意する点はないだろう。
プログラムを追いかけてみれば分かるように、myIntとmyFloatは引数として交換可能である。
ここでのポイントは、toStringインターフェイスを定義した後に、型myIntとmyFloatを定義していることである。これは、大規模なプログラムを作成する際に、事前にインターフェイスをしっかりと定義しておいて、具体的な型の振る舞いはその後に作成することが可能となることを意味している(例えば、当初はモックアップメソッドのみを作成し、実際のメソッドは事後作成する)。
今回は、Goのインターフェイスを体験した。今回のプログラムだけでは、Goのインターフェイスのどのあたりが便利なのか、ピンとこなかった人が多いのではと思う。次回は、インターフェイスの補充をするとともに、Goの基本機能でまだ触れていないところ(mapなど)を解説していきたいと思う。
2/2 |
Index | |
構造体の便利な用途、インターフェイス入門 | |
Page1 Goのインターフェイスの特徴 構造体の便利な定義とダックタイピング |
|
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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|