🔖
quickjs(Go binding)を試してみた
この記事はCyberAgent AI tech studio | Go Advent Calendar 2022 2日目の記事です。
quickjs
先日ぼーっとTwitterを見ていたらこのようなツイートを見かけました
どうやらJavaScriptのbindingsをGoでできるものらしく、Goの関数でJavaScriptをラップしていることもあり、wasmのように実行環境に依存せず、簡単にjsのコードを使えそうです。
syumaiさんはday.jsをラップしており、手元で触ってみたところ、普段とGoを書くときの体験そのままに使えたため自分でも何か作ってみたいと思い作ったのが以下のライブラリになります。
day.js同様に日時操作周りを作ってみたいと思い、moment.jsをラップしました。
使い方は非常にシンプルで以下のように使います。
package main
import (
"log"
"github.com/sivchari/go-momentjs"
)
func main() {
m, err := momentjs.New()
if err != nil {
panic(err)
}
const format = "YYYY年MM月DD日 HH:mm:ss"
m.Global.Set("fmt", m.QjsCtx.String(format))
defer m.ClearGlobal("fmt")
result, err := m.QjsCtx.Eval("moment().format(fmt)")
if err != nil {
panic(err)
}
resultDate := result.String()
result.Free()
log.Println(resultDate)
}
このコードを実行すると
2022/12/02 11:47:59 2022年12月02日 11:47:59
という出力が得られるので、期待通りにmoment.jsを使えることがわかります。
まとめ
最後までお読みいただきありがとうございました。基本的に標準パッケージや3rd packageを組み合わせるとGoで書けるものが多いですが、部分的にJavaScriptを使いたいときに効果的だなという印象です。
またES2020のインタプリタのため、何かしらの大きなOSSをラップしたりして面白いこともできそうだなという印象です。
Discussion