Go言語の構造体タグ(jsonタグなど)の使い方と活用例を初心者向けにやさしく解説
生徒
「Go言語で構造体に“タグ”って書くことがあると聞きました。jsonタグって何ですか?」
先生
「構造体タグとは、構造体のフィールドに補足情報を書いて、データを変換する手がかりにする仕組みです。特にjsonタグは、構造体とJSONのやり取りで使われますよ。」
生徒
「JSONってなんですか?難しそう…。」
先生
「JSONはデータのやり取りによく使われる“軽い文字列の箱”のようなフォーマットです。構造体タグを使うと、その箱にどうデータを入れるか決められますよ。」
1. 構造体タグとは?初心者向けの基本説明
構造体タグとは、構造体のフィールドに「このデータをどう扱うか」を伝えるためのメモのような役割を持つ仕組みです。バッククオート(`)で囲んで書くのが特徴で、特にjsonタグは、構造体とJSONを変換するときに使う「キー名(項目名)」を指定できます。難しそうに感じますが、タグがあることでデータの受け渡しがとてもスムーズになります。
たとえば、次のようにタグを書きます。
type Person struct {
Name string `json:"name"`
}
この場合、「Nameというフィールドは、JSONに変換するときはnameというキー名を使ってください」という指定になります。タグがないと大文字のNameとして出力されるため、一般的なJSONと形式が合わず不便になることがあります。タグがあるだけで、他のサービスやAPIとも正しくデータをやり取りできるようになります。
生徒
「タグってただの文字なのに、どうして大事なんですか?」
先生
「たとえば、相手のプログラムが小文字のnameにしか対応していなかった場合、タグがないとデータを受け取れずエラーになります。でもタグで“jsonではnameとして扱うよ”と教えてあげると、機械同士でもちゃんと話が通じるんです。」
生徒
「なるほど…!人間の名前タグみたいに、プログラムにも分かりやすい名前をつけてあげるイメージなんですね。」
先生
「そうです。タグは“見えるラベル”のようなものなので、初心者でも気軽に使えますよ。」
2. jsonタグを使った構造体定義の基本例
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
この例では、JSONに変えると{"name":"太郎","age":20}のようになります。タグを書かないと、Goのフィールド名そのまま(大文字)で出力されます。
3. json.Unmarshalとjson.Marshalの使い方
次に、JSONとGo構造体を行ったり来たりするコードを見てみましょう。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 構造体をJSONに変換
p := Person{Name: "花子", Age: 30}
b, _ := json.Marshal(p)
fmt.Println(string(b))
// JSONを構造体に戻す
var p2 Person
json.Unmarshal([]byte(`{"name":"次郎","age":25}`), &p2)
fmt.Println("名前:", p2.Name, "年齢:", p2.Age)
}
実行結果:
{"name":"花子","age":30}
名前: 次郎 年齢: 25
タグがあるからJSONとの変換がスムーズにできますね。
4. omitempty や "-" を使った細かい制御
タグにはオプションも書けます。omitemptyは値が“ゼロ値”(空文字や0など)のときにJSONに含めない設定です。json:"nickname,omitempty"のように使います。
"-"を書くと、完全に無視する意味です。JSONにもフィールドが出ません。
5. タグのオプション例:omitempty と "-" の実例
type Person2 struct {
Name string `json:"name"`
Nickname string `json:"nickname,omitempty"`
Secret string `json:"-"`
}
Nicknameが空ならJSONに出ず、Secretは常にJSONに出ません。
6. 実利用例:APIで構造体タグを活用する
Web APIのレスポンスやリクエストで、JSON形式のデータを送るとき、構造体タグが大活躍します。タグでキー名を合わせておけば、データが正しくマッチします。
7. 構造体タグの注意点とおすすめ設定
- 大文字・小文字の一致:Goでは構造体のフィールド名は大文字から始めないと外部パッケージから見えません。
- タグの書き方:`json:"name,omitempty"`のように、タグはスペースで区切り可能です。
- 他のタグも使える:DB操作系では
db:"id"など、他の仕組みでも使えます。
8. タグでコードが見やすくなる理由
タグを使うと、構造体に「このフィールドはJSONでこう使ってね」という情報が明確に残るので、あとからコードを読む人にもわかりやすくなります。画像やテキストのラベルを貼るようなイメージです。
まとめ
これまでの内容を振り返ると、構造体タグはとても便利な道具だと感じられたはずです。とくにGo言語の学習を始めたばかりの人は、構造体のフィールドにバッククオートで指定するという表記が少し不思議に見えたかもしれません。だけれども、実際には難しい魔法のような仕組みではなく、ひとつのフィールドに対して「このデータはこう扱ってね」と教えるちいさなメモのような役割を持っています。
さらに、実際の開発ではWebAPIなどの外部データとやり取りする場面がたくさんあります。外の世界では、データはほとんどの場合にJSONやXMLのような分かりやすい形式に変換されます。そんなとき、構造体タグを正しく扱うことで、送りたいデータを誤解なく受け取ってもらえるし、受け取ったデータをきれいな形で自分の構造体に流し込めます。人と人が会話するときに、言葉の意味を整理して伝えるようなものです。
そしてもうひとつ大切なのは、タグのオプションを覚えることです。とくに「omitempty」と「-」は、初心者ほど早い段階で身につけておきたい考え方です。値が空のときには無理に出力せずに見た目をすっきりまとめたり、まったく公開したくない情報を隠したりできます。
現場の開発では、構造体タグが設定されていないコードは読み手を不安にさせます。何が出てくるのか、どこが公開されるのか、どのキー名で外部とやり取りするのか分かりづらいからです。だけれども、タグがあるだけで、コードはすっきり整理され、チーム全体にとって読みやすい資料になります。見た目が整ったプログラムは、初心者の目にもやさしく映ります。
また、構造体タグはjson以外にも自由に使えます。データベース操作でつかう「db」タグ、画面表示を整えるためのカスタムタグなど、アイデア次第で使い道はたくさんあります。「Go言語はシンプルで読みやすい」という声が多い理由のひとつが、このタグの存在です。複雑な命令を増やすのではなく、フィールドにそっと情報を添えるという穏やかなアプローチは、プログラム全体の読み心地をやわらかくしてくれます。
それでも、慣れてしまえばタグは頼もしい味方になります。最初は小さな構造体からはじめ、次にAPIの受け渡しで使ってみて、最後に大きなプロジェクトでも自然に使えるようになると、Go言語の世界が一気に広がります。
JSONが苦手だと感じていた人でも、構造体タグを理解することで「なるほど、こうやって形が揃うんだ」と、すっきり納得できる場面が増えます。さらに、テストやバグ調査のときも、タグがあると原因を追いやすくなります。構造体タグを怖がらずに触ってみることで、プログラミングの世界が少しずつ心地よくなっていくでしょう。
サンプルプログラムで振り返ろう
package main
import (
"encoding/json"
"fmt"
)
type Product struct {
Title string `json:"title"`
Price int `json:"price"`
Secret string `json:"-"`
}
func main() {
p := Product{Title: "りんご", Price: 120, Secret: "ひみつのなまえ"}
b, _ := json.Marshal(p)
fmt.Println(string(b))
}
この例では、Secretは出力されません。見せなくてよい値を隠すことで、余計な情報を外に出さずにすみます。たくさんの商品を扱うサービスでも役立ちますし、プライバシーを守る仕組みにもつながります。
生徒
「jsonタグは少し難しいと思っていたけれど、名前を変えるだけじゃなくて、不要なデータを消すこともできるんですね。」
先生
「そうなんです。構造体はただの箱じゃなくて、タグをつけることで好きな形に整えることができるんです。データが多いときほど、タグの効果は大きくなりますよ。」
生徒
「バッククオートを忘れないように気をつけます。最初は違和感がありましたが、少しずつ慣れてきました。」
先生
「慣れると簡単に使いこなせます。APIの開発やファイルの保存などにも応用できるので、少しずつ触ってみてください。」