Go言語でデザインパターンを使ってファイル出力
テンプレートメソッドのようなものを作ってみました。
test.txtファイルからデータを読み込み、Temp.txtとTemp.htmlに出力するプログラムです。
インターフェースを使ってポリモフィズムを実現し、使いまわす処理を
templateWrite関数として作り、各インターフェースの実装として使っています。
処理を使いまわすということはテンプレートメソッドのようなことが出来ますし、
templateWriteは後から変更ができるので、アダプターパターンのようなことも出来そうです。
一応こんなやり方で書いてみたのですが、綺麗な(マナーのよい)やり方になってるでしょうか?
ともあれ、この言語は非常に面白いですね!
インターフェースオンリーにすることで、複雑になりがちなクラスの管理を省き、
ポリモフィズムのみに焦点をおいたのは非常にいいことなんじゃないかなと思います。
- プログラム作成する際に参考にしたところ
ファイル入出力の参考にするサイトがほとんどなかったので、公式サイトでいろいろ探しました。
Go code searchでは、いろんなソースを検索できるので、ここでファイル書き込み方法も調べられました。
http://blog.innx.co.jp/programming/2009-11-14-golang-cgi-form-sample
GOでCGIを作成している方のサイトです。ファイル入出力のパッケージの使い方で勉強になりました。
ありがとうございます!
コンパイル時に表示されるEOFなんたらかんたらの意味。
どうやらかっこの対応が悪いようです。
package main import "fmt" import "io" import "os" import "bytes" import "strings" type BaseFile interface { Write(file ,data string); GetData(str string) string; GetFileName() string; } func WriteData(data BaseFile,str string) { var tempfile,tempstr string; tempstr = data.GetData(str); tempfile = data.GetFileName(); data.Write(tempfile,tempstr); } func templateWrite(file,data string) { if err := io.WriteFile(file,strings.Bytes(data),0644); err!= nil{ fmt.Println("Error WriteHTML File",err); } } type HTMLFile struct{ } func (HTMLFile) Write(file,data string) { templateWrite(file,data) } func (HTMLFile) GetData(str string) string { return "<HTML><HEAD><TITLE>"+str+"</TITLE></HEAD><BODY><P>"+str+"</P></BODY></HTML>"; } func (HTMLFile) GetFileName() string { return "Temp.html"; } type TXTFile struct{ } func (TXTFile) Write(file,data string) { templateWrite(file,data) } func (TXTFile) GetData(str string) string { return str; } func (TXTFile) GetFileName() string { return "Temp.txt"; } func main() { var filedata []byte; var err os.Error; filedata,err = io.ReadFile("./test.txt"); if err != nil{ fmt.Println("Open Error"); os.Exit(1); } fmt.Println(bytes.NewBuffer(filedata).String()); var temptxt TXTFile; var temphtml HTMLFile; array := [] BaseFile{temptxt,temphtml}; for _,b := range array{ WriteData(b,bytes.NewBuffer(filedata).String()) } }