演習4
演習3のプログラムを変更し,テキストを0.5秒毎に1文字ずつ表示するメソッドPlayを定義せよ.その際,*TextBoxを匿名フィールドとして埋め込んだ型を新たに定義し,その新たに定義した型で,TextBoxのメソッドを利用できることを確認せよ.
解答例
解答例
- package main
- import (
- "time"
- "./textbox"
- )
- const text = "The Go programming language is an open source project to make programmers more productive."
- // --- ProblemBox ---
- // 問題文を0.5秒ごとに1文字ずつ表示するデータ型.
- type ProblemBox struct {
- *textbox.TextBox
- text string
- }
- // 位置,大きさ,表示する問題文を指定してProblemBoxを生成する.
- func New(x,y,w,h int, s string) (pb *ProblemBox) {
- return &ProblemBox{textbox.New(x,y,w,h),s}
- }
- // 問題文を0.5秒ごとに表示する.
- func (pb *ProblemBox) Play() {
- pb.Clear()
- for i:= 0; i < len(pb.text); i++ {
- pb.Putc(pb.text[i])
- time.Sleep(5e8)
- }
- pb.Puts("[Enter]");
- }
- // --- ProblemBox end ---
- func main() {
- textbox.Clear()
- t1 := New(3,3,70,4, text)
- t1.Play()
- }
解説
解説
匿名フィールド
- 11行目から14行目では,新たな型ProblemBoxを定義し,その中に匿名フィールド*TextBoxを埋め込んでいます.TextBoxはtextboxパッケージで定義されている型なので,*textbox.TextBoxと記述しています.ProblemBoxには匿名フィールドの他に,問題文を保持するためのtextというフィールドを持たせます.
- 関数Newでは,ProblemBox型のデータを生成します.18行目では,組込み関数のnewを使う代わりに,複合リテラルを使って,初期値の設定とメモリ割り当てを同時に行っています.匿名フィールドの初期値には,textboxパッケージの関数New()で生成したTextBox型のデータへのポインタを設定しています.
- 匿名フィールドについては,匿名フィールド(埋め込みフィールド)で継承のようなことや言語仕様を参照してください.
Sleep関数
- 0.5秒ごとに文字を表示するために,timeパッケージの関数Sleep()を用います.
- timeは,時間の計測と表示機能を提供するパッケージです.
- Sleepのシグネチャは func Sleep(ns int64) os.Error です.64ビット長の整数を引数(nsとします)にとり,nsナノ秒間,プログラム(ゴルーチン(後報))を停止します.
- 27行目の time.Sleep(5e8) で,5*10^8ナノ秒間(= 0.5秒間)停止します.
- timeパッケージを利用するには,それをインポートする必要があります.constと同様に,importでも()を使って,複数のパッケージのインポートをまとめて記述することができます.2行目から5行目では,timeとtextboxの二つのパッケージのインポートをまとめて記述しています.
- timeパッケージの詳細は,パッケージドキュメントを参照してください.
- ちなみに(この演習には関係ありませんが),date=time.LocalTime().Format(time.RFC3339) とすることで,現在時刻をRFC3339の形式で得ることができます.従って,date[0:4]+"年"+date[5:7]+"月"+date[8:10]+"日" で,YYYY年MM月DD日という形式の文字列を得ることができます.
プログラムの動作(Play)
- 23行目でProblemBoxをクリア.
- 26行目で,問題文textから1文字ずつ取り出し,その文字を表示.26行目のPutcはTextBoxのメソッドだが,ProblemBoxに*TextBoxが埋め込まれているので,ProblemBoxのメソッドとして呼び出すことができる.
- 27行目で,0.5秒停止.
- 29行目で[Enter]を表示.
プログラムの動作(main)
- 35行目で画面全体をクリア.
- 37行目でProblemBoxを生成.
- 38行目で,ProblemBoxを再生(Play).