gopherjsを使う時にファイル入出力があると変換処理が必要になる。
そしてosパッケージが使えないため機能のテストをしにくい。
jsを使ったテストコードをgo上で書くのは結構面倒くさいので切り分けて書くと楽でした。
以下のようにファイルを分けたmainパッケージを作ります。
- imageFunc.go ← osやroutine機能を使わないメソッド
- imageMain.go ← js機能を使った関数登録や変換をするmain
- imageTest.go ← os機能を使ってファイルを渡すテストのmain
実際に呼び出すimageFunc.goの関数を中継する関数を作りわけます。
jsから呼び出すための機能はbyte配列にして受け渡しするようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import ( "github.com/gopherjs/gopherjs/js" ) //入力にjs.Objectを含む関数の中継 func setFontRelay(name string, fj *js.Object)string{ return setFont(name,js.Global.Get("Uint8Array").New(fj).Interface().([]byte)) } //出力にjs.Objectを含む関数の中継 func makeImgRelay(imgtype string, fn string, rgb []byte, opts[]int)*js.Object{ buf := makeImg(imgtype, fn, rgb, opts) return js.NewArrayBuffer(buf) } func main() { js.Global.Set("setFont",setFontRelay) js.Global.Set("makeImg",makeImgRelay) } |
Testの方でも適当にbyte配列に変換することでimageFuncのテストが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
func setFontRelay(name string)string{ file,_ := os.Open("xxxxx") defer file.Close() bytes,_ := ioutil.ReadAll(file) setFont(name,bytes) return "set "+name } func makeImgRelay(imgtype string, fn string, rgb []byte, opts[]int){ file,_ := os.Create("xxxxx") defer file.Close() buf := makeImg(imgtype, fn, rgb, opts) file.Write(buf) } |
あとは用途に合わせて引数を変えて実行します。
1 2 3 4 5 |
//機能のテスト go run imageTest.go imageFunc.go //jsに変換 gopherjs build imageMain.go imageFunc.go |
そもそもjavascriptでファイル入出力する用途が少なそうではありますが、中継を挟むと色々やりやすくなりそうです。
これで実装に専念できる。