エンコードとは、プログラム内部のデータ(Go の構造体など)を、送信・保存できるバイト列(JSON 文字列など)に変換すること。デコードはその逆で、受け取ったバイト列を内部のデータ構造に戻すこと。
なぜ変換が要るかというと、メモリ上の構造体はそのプロセスの中でしか意味を持たないから。ネットワークの向こうの相手やファイルに渡すには、言語に依存しない共通形式へ直す必要がある。
覚え方は接頭辞で持つ:en- は「中に入れる」(encase・enclose の仲間)=データを符号(code)に詰める。de- は「解く」(decipher・decompress の仲間)=符号を解いて取り出す。
データ取り込み(ingestion)の処理は、外部 API の JSON をデコードして構造体で加工し、次の送信先へエンコードして渡す、という往復で書ける。
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
// デコード:API レスポンスのバイト列 → 構造体
var u User
if err := json.Unmarshal(body, &u); err != nil {
return err
}
// エンコード:加工した構造体 → 次へ送るバイト列
out, err := json.Marshal(u)
バッククォートの json:"id" は構造体タグで、JSON のキーと Go のフィールドの対応表になる。Go 側はフィールド名が大文字始まり(公開)でないと変換対象にならない点もセット。
json.Unmarshal は、タグとキー名が一致しないフィールドをエラーにせずゼロ値のまま通す。ingestion だと「エラーは出ないのに値が全部空」という形で現れるので、取り込み結果が空のときはまずタグの typo を疑う。
エンコード=内部→外部形式、デコード=外部→内部。ingestion のコードは「入口で Unmarshal、出口で Marshal」の往復で読める。