前の記事で、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@latest
Marshal用の関数の出力
適当にファイルを作成する。今回は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"}