前の記事で、JavaScriptからGo間の関数を呼び出し、引数と返り値でstringをやり取りするやり方を紹介した。

今回はstring型が使えることを利用して、Goで構造体をJSON化し、Node.jsで受け取れるようにしたい。

デフォルトのencoding/jsonを使うとビルドはできるものの動かなくなってしまうのでjson-iceを利用する

必要なバイナリをインストール

json-icegoimportsをインストールする

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"}

参考