Go言語 : 構造体のフィールドの横、構造体タグの記法について

どうもです。

今回は、Go言語の構造体にメタ情報を追加するタグについてです。

Go言語を書いていると、jsonやyamlなどのデータに

構造体を変換するときとかに、このタグを使います。

こんな感じです。

type kouzoutai struct {
	//バッククォートで囲む使い方がオーソドックス。普通の文字列でもいけるけど
    ID      bson.ObjectId  `bson:"_id" json:"id"`
	Title   string         `json:"title"`
	Options []string       `json:"options"`
	Results map[string]int `json:"results,omitempty"`
}

このように書くことで、構造体の各フィールドをjsonやyamlに変換する際に、

タグで指定した名前をキーとして紐付けてキーにすることができます。

{“キー”: “データの中身”}

みたいな感じになります。

基本的な使い方はもう先人が書いているので割愛します。

大事なのは何があるとどうハマるかです。

筆者は下記の本を脳死写経してソースを書いていました。

しかし脳死写経にも関わらず記載をミスって、

アプリがうまく動作しなくなりました()


コンパイルは通っているので

ログを増やして調べようと思ったのですが、

結局答えがわからなかったので、

vscodeで正しく動くソースと差分を取って確認したところ、

下記のミスが見つかりました。

type kouzoutai struct {
	//バッククォートで囲む使い方がオーソドックス。普通の文字列でもいけるけど
    ID      bson.ObjectId  `bson: "_id" json: "id"`
	Title   string         `json: "title"`
	Options []string       `json: "options"`
	Results map[string]int `json: "results,omitempty"`
}

わかるでしょうか?

各タグとタグ名の間に、空白が入ってしまっているのです。

構造体タグにおいては、タグとタグの間には

空白を入れても良いのですが、

こうして不適切な場所に空白を挟むとタグの読み取りができません。

構造体タグの実体は文字列なので、コンパイル自体は成功しますが、

データが読み取られないのでもっと後ろの段階になってから問題が顕在化することになります。

コンパイルエラーにならない不具合として、

構造体タグに慣れていない時はチェックの観点にするといいな、と思いました。

ちなみに余談ですが、上の方で紹介した本について、

GoでのWebアプリ開発本としては2冊目にしたほうがいいなと思いました。

下記の本です。

こちらの本でGoのWeb開発のためのパッケージやそのアーキテクチャについて、

リテラシーをつけてから読むという順番にしたほうがいいな、と思いました。

(実際筆者はそうしましたが、そうでなければ読むペースがかなり遅くなっただろうなと思います)

Goの標準ライブラリが中心の内容のため、

言語仕様のリテラシーをつけるのにもいいかと思います。

広告料とか別に入らないですが、普通にいい本だな、と思ったので

よければ読んでみてください。

以上、読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました