توضح هذه الوثيقة البروتوكول الثنائي لعملاء ClickHouse عبر بروتوكول TCP.
Varint
بالنسبة إلى الأطوال، ورموز الحزم، والحالات الأخرى، يُستخدم ترميز varint غير الموقّع. استخدم binary.PutUvarint وbinary.ReadUvarint.
String
تُشفَّر السلاسل النصية متغيرة الطول على هيئة (الطول، القيمة)، حيث يكون الطول varint وتكون القيمة سلسلة UTF-8.
s := "Hello, world!"
// كتابة طول السلسلة النصية كـ uvarint.
buf := make([]byte, binary.MaxVarintLen64)
n := binary.PutUvarint(buf, uint64(len(s)))
buf = buf[:n]
// كتابة قيمة السلسلة النصية.
buf = append(buf, s...)r := bytes.NewReader([]byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
})
// قراءة الطول.
n, err := binary.ReadUvarint(r)
if err != nil {
panic(err)
}
// تحقّق من n لتجنّب OOM أو استثناء وقت التشغيل في make().
const maxSize = 1024 * 1024 * 10 // 10 MB
if n > maxSize || n < 0 {
panic("invalid n")
}
buf := make([]byte, n)
if _, err := io.ReadFull(r, buf); err != nil {
panic(err)
}
fmt.Println(string(buf))
// Hello, world!00000000 0d 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 |.Hello, world!|DUhlbGxvLCB3b3JsZCEdata := []byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
}الأعداد الصحيحة
Int32
v := int32(1000)
// Encode.
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf, uint32(v))
// Decode.
d := int32(binary.LittleEndian.Uint32(buf))
fmt.Println(d) // 100000000000 e8 03 00 00 00 00 00 00 |........|6AMAAAAAAAAالنوع المنطقي
يُمثَّل النوع المنطقي ببايت واحد؛ حيث إن 1 تعني true و0 تعني false.