This is a creation in Article, where the information may have evolved or changed. 
In the process of network transport protocol, the common way of packet encapsulation is generally:
① Header ID + data header (Type/attribute/data length) + Data body + Tail ID--generally also need to be escaped
② fixed Length--codec convenient, waste broadband
③ by the end mark (eg. transfer via base64, ends with a)--codec convenient, waste Broadband
 
The following are the common means of Golang decoding
 
 
  
  - Decoding
 The first thing you need to do is convert the []byte ASCII string to Uint8,uint16,uint32,uint64, which corresponds to Python's b,h,i,q, respectively]. Pay special attention to big-endian and small-end alignment (python big-endian ">", "Small End" < ", Also use their ASCII bar here)
 
  This is an example of,  decoding out   ">hhi" Func unpack (data []byte, edian byte)   (UInt16,  uint16, uint32, []byte)  {    datatype := touint16 (Data[0:2] ,  edian)     dataattr := touint16 (Data[2:4], edian)      datalen := touint32 (Data[4:8], edian)     extra := data[8:]     return datatype, dataattr, datalen, extra}func touint8 (buf  []byte, edian byte)  uint8 {    // len (BUF)  == 1     -->b    t := uint8 (buf[0])      Return t}func touint16 (Buf []byte, edian byte)  uint16 {     // len (BUF)  == 2    -->H    t :=  UInt16 (buf[0])     if edian == 62 { //  ">"          t = t<<8 | uint16 (buf[1])     } else if  edian == 60 { //  "<"         t =  T | uint16 (buf[1]) <<8    }    return t}func  ToUInt32 (Buf []byte, edian byte)  uint32 {    // len (BUF)  == 4    -->i    t := uint32 (Buf[0])      if edian == 62 {        t =  t << 24        t = t |  UInt32 (Buf[1]) <<16        t = t | uint32 (buf [2]) <<8  &nbsP;     t = t | uint32 (buf[3])     } else  if edian == 60 {        t = t  | uint32 (buf[1]) <<8        t = t |  uint32 (buf[2]) <<16        t = t |  UInt32 (Buf[3]) <<24    }    return t}func touint64 (buf  []byte, edian byte)  uint64 {    //len (BUF)  == 8     -->q    t := uint64 (buf[0])     if  edian == 62 {        t = t <<  56        t = t | uint64 (buf[1]) <<48      &nbSp;  t = t | uint64 (buf[2]) <<40         t = t | uint64 (buf[3]) <<32        t  = t | uint64 (Buf[4]) <<24        t =  t | uint64 (buf[5]) <<16        t = t  | uint64 (Buf[6]) <<8        t = t |  uint64 (Buf[7])     } else if edian == 60 {         t = t | uint64 (buf[1]) <<8         t = t | uint64 (buf[2]) <<16         t = t | uint64 (buf[3]) <<24         t = t  | uint64 (buf[4]) <<32        t = t |  UInt64 (Buf[5]) <<40        t = t | uint64 (buf [6]) <<48        t = t | uint64 (Buf[7]) <<56     }    return t} 
 
 
  This is an example, coded as ">hhi" Func pack (datatype uint16, dataattr uint16, datalen  UInt32)  []byte {    buf := make ([]byte, 8)      putuint16 (datatype, buf[0:2], 62)     putuint16 (DataAttr, buf[2:4],  62)     putuint32 (datalen, buf[4:8], 62)     //buf  = buftype + bufattr + buflen    return buf}func  PutUInt8 (Num uint8, buf []byte, edian byte)  {    // len (BUF)  == 1    buf[0] = byte (num)}func putuint16 (num uint16,  buf []byte, edian byte)  {    // len (BUF)  == 2     buf[0] = byte (num >> 8)     buf[1] =  byte (num)     if edian == 62 { //  ">"     } else if  edian == 60 { //  "<"         buf[0]  ^= buf[1]        buf[1] ^= buf[0]         buf[0] ^= buf[1]    }}func putuint32 ( Num uint32, buf []byte, edian byte)  {    // len (BUF)  == 4    buf[0] = byte (num >> 24)      buf[1] = byte (num >> 16)     buf[2] = byte (num &NBSP;>>&NBSP;8)     buf[3] = byte (num)     if  edian == 62 {    } else if edian == 60 {       &nbSP;&NBSP;BUF[0]&NBSP;^=&NBSP;BUF[3]&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;BUF[3]&NBSP;^=&NBSP;BUF[0]         buf[0] ^= buf[3]         buf[1] ^= buf[2]        buf[2] ^= buf[ 1]        buf[1] ^= buf[2]    }}func  putuint64 (Num uint64, buf []byte, edian byte)  {    //  len (BUF)  == 8    if edian == 62 {         buf[0] = byte (num >> 56)          buf[1] = byte (num >> 48)          buf[2] = byte (num >> 40)         buf[3]  = byte (nUM&NBSP;>>&NBSP;32)         buf[4] = byte (num > > 24)         buf[5] = byte (num >> 16 )         buf[6] = byte (num >> 8)          buf[7] = byte (num)     } else if  edian == 60 {        buf[0] = byte (num)         buf[1] = byte (num >> 8)          buf[2] = byte (num >> 16)          buf[3] = byte (num >> 24)          buf[4] = byte (num >> 32)          buf[5] =&Nbsp;byte (num >> 40)         buf[6] = byte ( num >> 48)         buf[7] = byte (num  >> 56)     }}