前の記事で、JavaScriptからGo間の関数を呼び出し、引数と返り値でstringをやり取りするやり方を紹介した。
今回はstring型が使えることを利用して、Goで構造体をJSON化し、Node.jsで受け取れるようにしたい。
デフォルトのencoding/jsonを使うとビルドはできるものの動かなくなってしまうのでjson-iceを利用する
必要なバイナリをインストール
json-iceとgoimportsをインストールする
go install github.com/moznion/go-json-ice/cmd/json-ice@latest
go install golang.org/x/tools/cmd/goimports@latestMarshal用の関数の出力
適当にファイルを作成する。今回はmain.go
package main
type AwesomeStruct struct {
Foo string `json:"foo"`
Bar string `json:"bar,omitempty"`
}
func main() {
}続いてターミナルでjson-ice -type [構造体の名前]
を実行する
json-ice -type AwesomeStructまた、このときにimport "fmt"などの記述がすでにファイルにあるとinternal error: package "fmt" without types was imported from "hoge/hoge"とエラーが出て失敗するので、その場合は適当な別のディレクトリのファイルに構造体をコピペして実行するのが良いかも(?)
成功するとawesome_struct_gen.goというファイルが生成される
生成されたファイルを使ってMarshalする
awesome_struct_gen.goの中にMarshalAwesomeStructAsJSON関数が定義されているのでそれを利用する
今回は試しにfmt.Printlnで出力してみる。
main.goを以下のように編集する
package main
import "fmt"
type AwesomeStruct struct {
Foo string `json:"foo"`
Bar string `json:"bar,omitempty"`
}
func main() {
awesome := AwesomeStruct{"foo", "bar"}
text, _ := MarshalAwesomeStructAsJSON(&awesome)
fmt.Println(string(text))
}Goで実行する
JSONに変換されている事がわかる
$ go run .
{"foo":"foo","bar":"bar"}