GopherJSを利用して、GoをJavaScriptに変換する
概要
今回は、GoをWebブラウザ上で動作させるために、GopherJSを利用する方法を解説します。
他にも方法やツールはありますが、私が読んでいたオープンソースプロジェクトで使われていて興味を持ったため、今回はGopherJSについて調査しました。
公式のドキュメントを読んでも、ひとまず動作確認する方法が分かりにくかったため、本記事では、簡単なプログラムを動作させるところまでを解説しています。
GopherJSとは
GopherJS
https://github.com/gopherjs/gopherjs
GopherJSは、GoをJavaScriptに変換するツールです。
このことによって、GoプログラムをWebブラウザで実行できるようになります。
Cgoに対応していないという制約はあるようです。
Goのインストール
現状、GopherJSはGo 1.16以降のバージョンで動作します。
手元のPCでGoが入っていない場合は、Homebrewなどでインストールしてください。
もし、バージョンが異なるGoがすでに入っている場合は、
以下の手順で、GopherJS用のGoをインストールできます。
$ go get golang.org/dl/go1.16.3
$ go1.16.3 download
$ export GOPHERJS_GOROOT="$(go1.16.3 env GOROOT)"
GopherJSのインストール
GopherJSのインストールは、以下のコマンドで行なえます。
$ go get -u github.com/gopherjs/gopherjs
gopherjsコマンドが実行できるようになります。
$ gopherjs
GopherJS is a tool for compiling Go source code to JavaScript.
Usage:
gopherjs [command]
Available Commands:
build compile packages and dependencies
doc display documentation for the requested, package, method or symbol
get download and install packages and dependencies
help Help about any command
install compile and install packages and dependencies
run compile and run Go program
serve compile on-the-fly and serve
test test packages
version print GopherJS compiler version
Flags:
-h, --help help for gopherjs
Use "gopherjs [command] --help" for more information about a command.
変換対象のGoプログラムを作成
以下のようにGoプログラムを作成します。
package main
import "github.com/gopherjs/gopherjs/js"
func main() {
js.Global.Set("pet", map[string]interface{}{
"New": New,
})
js.Global.Get("document").Call("write", "Hello world!")
}
type Pet struct {
name string
}
func New(name string) *js.Object {
return js.MakeWrapper(&Pet{name})
}
func (p *Pet) Name() string {
return p.name
}
func (p *Pet) SetName(name string) {
p.name = name
}
js.Global
が記述されている部分が、Goからのやりとりの部分になります。
js.Global.Get("document").Call("write", "Hello world!")`
の部分は、Hello world!
という文字列を表示させる処理を記述しています。
js.Global.Set("pet", map[string]interface{}{
"New": New,
})
の部分は、Goで定義したPet構造体の処理をJavaScriptから呼び出すための設定です。
JavaScriptで、pet.New('Maru').Name()
という記述で処理を呼び出せるようにしています。
変換されたJavaScriptを読み込む処理を実装
以下のような index.html
ファイルを作成します。
<html>
<head>
<script src="./test.js"></script>
<script src="./main.js"></script>
</head>
</html>
test.js
は、Goプログラムから変換したJavaScriptファイルです。
main.js
は、test.jsに定義されたスクリプトを呼び出す用のJavaScriptファイルです。
以下のような、内容になっています。
alert(pet.New('Maru').Name());
GoをJavaScriptに変換
以下のようなコマンドで、GoをJavaScriptに変換します。
$ gopherjs build -o test.js
実行すると test.js
が出力されます。
動作確認
index.htmlをブラウザで開くと、以下のような動作が確認できます。
- 「Maru」という文字列がalertで表示される
- 「Hello world!」という文字列がブラウザに表示される
以上で、GoをJavaScriptに変換して動作確認できるようになりました。
まとめ
GopherJSで、Goの簡単なプログラムをJavaScriptに変換して、ブラウザ上で実行するところまでを解説しました。
Goで書かれたプログラムをブラウザでも使用したい場合などに便利ですね。機会があれば、使っていきたいですね。