こちら

GopherJS
1 / 15
Webのはなし
昨今はフロントエンドでより多くの処理をするようになっている
サーバーサイドとフロントエンドで全く同じ処理を行いたい場合
もある
2 / 15
たとえば
サーバーサイドのAPIを使うより速く結果を得たい
マークアップテキスト(Markdown)をフロントエンドでパースし
たい
3 / 15
ソリューション
nodejs
4 / 15
ソリューション
nodejs
みんながみんなサーバーサイドをJavaScriptで書きたいわけでは
ない
5 / 15
ソリューション
nodejs
Golang
Python
Ruby
Haskell
のコードをJavaScriptに変換するという手段
6 / 15
GopherJS
https://github.com/gopherjs/gopherjs
GoのコードをJavaScriptに変換する
Goのライブラリをブラウザ上で動かす
DOM操作
GoからJavaScriptライブラリの呼び出し
JavaScriptからGoライブラリの呼び出し
が可能
7 / 15
例1 DOM操作
js.Global
.Get("document")
.Call("write", <input id="btn" type="button" value="alert"> )
js.Global
.Get("document")
.Call("getElementById", "btn")
.Set("onclick",
func(ev *js.Object) {
js.Global.Call("alert", "hoge")
})
8 / 15
例1 DOM操作
js.Global
.Get("document")
.Call("write", <input id="btn" type="button" value="alert"> )
js.Global
.Get("document")
.Call("getElementById", "btn")
.Set("onclick",
func(ev *js.Object) {
js.Global.Call("alert", "hoge")
})
main = function() {
var $ptr;
$global.document.write(
$externalize("<input id=\"btn\" type=\"button\" value=\"alert\">", $String));
$global.document.getElementById(
$externalize("btn", $String)).onclick = $externalize((function(ev) {
var $ptr, ev;
$global.alert($externalize("hoge", $String));
}), funcType);
};
関数もエクスポート可能
9 / 15
例2 fmt
fmt.Println("test")
C#でいう Console.WriteLine("test")
10 / 15
例2 fmt
fmt.Println("test")
C#でいう Console.WriteLine("test")
_r = fmt.Println(new sliceType$1([new $String("test")])); /* */ $s = 1; case 1: if($c) {
_r;
/* */ $s = -1; case -1: } return; } if ($f === undefined) { $f = { $blk: main }; } $f.$p
11 / 15
例2 fmt
fmt.Println("test")
C#でいう Console.WriteLine("test")
_r = fmt.Println(new sliceType$1([new $String("test")])); /* */ $s = 1; case 1: if($c) {
_r;
/* */ $s = -1; case -1: } return; } if ($f === undefined) { $f = { $blk: main }; } $f.$p
12 / 15
例3 Goのライブラリの利用
Blackfriday: a markdown processor for Go
https://github.com/russross/blackfriday
var data = []byte(
`# Title
sample markdown
**strong**`
)
func main() {
b := blackfriday.MarkdownBasic(data)
js.Global.Get("document").Call("write", string(b))
}
13 / 15
例4 GoのライブラリをJavaScriptから利用
js.Global.Set("convert", func(text string) string {
return string(blackfriday.MarkdownBasic([]byte(text)))
})
global に convert をエクスポート
document.write(convert("*hoge* ***fuga***"));
14 / 15
まとめ
JavaScriptはアセンブラ
15 / 15