gobとバイナリエンコーディング
Goの値をエンコードします
「gobとバイナリエンコーディング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
gobとは
encoding/gobは、Goの値をシリアライズするためのGo専用バイナリ形式です。コンパクトで高速なため、Goプログラム間の通信やディスク上の保存に適しています。
gobとJSON
JSONはテキスト形式で人間が読みやすく、言語をまたいで利用できます。gobはバイナリ形式でGo専用ですが、エンコードがよりコンパクトで高速です。両端がGoプログラムの場合はgobを使用してください。
バッファへのエンコード
gob.Encoderは任意のio.Writerに書き込みます。ここではbytes.Bufferを使ってバイナリ出力を保持します。
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
func main() {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
enc.Encode(42)
fmt.Println("bytes written:", buf.Len())
}バッファからのデコード
gob.Decoderはio.Readerから読み取り、Unmarshalと同様にポインタが指す値にデータを格納します。
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
func main() {
var buf bytes.Buffer
gob.NewEncoder(&buf).Encode(42)
var n int
gob.NewDecoder(&buf).Decode(&n)
fmt.Println(n)
}構造体のエンコード
gobは構造体を自然に扱えます。エンコードされるのは公開フィールドだけです。
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
var buf bytes.Buffer
gob.NewEncoder(&buf).Encode(User{"Ann", 30})
var u User
gob.NewDecoder(&buf).Decode(&u)
fmt.Println(u)
}マップとスライスのエンコード
マップやスライスなどの複合型は、透過的にエンコードおよびデコードできます。
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
func main() {
var buf bytes.Buffer
gob.NewEncoder(&buf).Encode([]int{1, 2, 3})
var s []int
gob.NewDecoder(&buf).Decode(&s)
fmt.Println(s)
}自己記述型ストリーム
gobストリームには型情報が含まれるため、互換性のある少し異なる構造体に対応付ける場合でも、デコーダーは値を再構築できます。余分なフィールドや不足しているフィールドも許容されます。
公開フィールドのみ
JSONと同様に、gobがエンコードするのは公開フィールドだけです。非公開(小文字で始まる)フィールドは何も通知されずにスキップされます。
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type T struct {
Public int
private int
}
func main() {
var buf bytes.Buffer
gob.NewEncoder(&buf).Encode(T{Public: 1, private: 2})
var out T
gob.NewDecoder(&buf).Decode(&out)
fmt.Println(out.Public, out.private)
}その他のバイナリ形式
固定長の生バイナリを扱う場合、encoding/binaryは整数や浮動小数点数をビッグエンディアンまたはリトルエンディアンで書き込みます。gobより低レベルで、自己記述型ではありません。
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
var buf bytes.Buffer
binary.Write(&buf, binary.BigEndian, uint32(258))
fmt.Println(buf.Bytes())
}使い分け
次のように選択します。
json- API、設定、言語間のデータ交換gob- Go間の通信、コンパクトさ、構造体の扱いやすさbinary- 正確なバイトレイアウト、プロトコル
人間には読めない形式
gobの出力はバイナリ形式のため、表示すると意味の分からない文字列になります。これはコンパクトさの代償です。人間が読むログではなく、機械で扱うデータに使用してください。
クイックチェック
gobはどのような場合にJSONより適していますか?
まとめ
gobとバイナリエンコードには次の特徴があります。
gob.NewEncoder/NewDecoderはGo間のバイナリ通信に使用します- コンパクトで自己記述型ですが、公開フィールドだけが対象です
encoding/binaryは正確なバイトレイアウトに使用します- 言語間のデータ交換と読みやすさでは、引き続きJSONが最適です
よくある質問
「gobとバイナリエンコーディング」レッスンは無料ですか?
はい。「gobとバイナリエンコーディング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「gobとバイナリエンコーディング」で何を学びますか?
Goの値をエンコードします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「gobとバイナリエンコーディング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- encoding/jsonのおさらい
- encoding/xml
- encoding/csv
- gobとバイナリエンコーディング