結構體與[]byte不能直接轉化,可以通過gob來轉換。
創新互聯專業為企業提供鄱陽網站建設、鄱陽做網站、鄱陽網站設計、鄱陽網站制作等企業網站建設、網頁設計與制作、鄱陽企業網站模板建站服務,十余年鄱陽做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。
編碼時如下,假設默認的結構體為data
func Encode(data interface{}) ([]byte, error) { buf := bytes.NewBuffer(nil) enc := gob.NewEncoder(buf) err := enc.Encode(data) if err != nil { return nil, err } return buf.Bytes(), nil }解碼時如下,data為需要解碼的字節數組,to為相應的接收結構體,記住to的結構體結構應與被編碼的data相一致,解碼后內容保存在to里面,直接使用to即可
func Decode(data []byte, to interface{}) error { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) return dec.Decode(to) }使用的時候:
b, err := Encode(data) if err != nil { //錯誤處理 } if err := Decode(b, to); err != nil { //錯誤處理}
Go中的binary包實現了簡單的數字與字節序列的轉換以及變長值的編解碼
package main
import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲 LittleEndian小端順序存儲 binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }
輸出
[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b
也可以使用下面的方式
n := 0x12345678 var data []byte = make([]byte,4) //操作的都是無符號整型 binary.BigEndian.PutUint32(data,uint32(n))
可以使用下面的方式判斷當前系統的字節序類型
const INT_SIZE int = int(unsafe.Sizeof(0))
//判斷我們系統中的字節序類型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }
1、string到int
2、string到int64
3、string到int32
4、字符串 轉 uint64
1、int到string
2、int64到string
3、uint64 轉 字符串
uint8,int8,uint16,int16,uint32,int32,float32,uint64,int64,float64
1、int64與uint64
2、int64轉float64
1、string 轉為[]byte
2、byte轉為string
golang語言本身就是c的工具集,開發c的程序用到的大部分結構體,內存管理,攜程等,golang基本都有,他只是在這個基礎上又加了一些概念這里說一個很小的問題,就是字節數組轉string的問題,網上大部分都是這樣轉的(包括google上):string(p[:]),這個轉完了是有問題的,我們再來看一下string這個結構體:
struct String
{
byte* str;
intgo len;
};
這個結構體讓我想起了nginx的string,他是這樣定義的:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
golang里邊 string的概念其實不是以前遇到\0結尾的概念了,他其實就是一塊連續的內存,首地址+長度,上面那樣賦值,如果p里邊有\0,他不會做處理這個時候,如果再對這個string做其他處理就可能出問題了,比如strconv.Atoi轉成int就有錯誤,解決辦法就是需要自己寫一個正規的轉換函數:
func byteString(p []byte) string {
for i := 0; i len(p); i++ {
if p[i] == 0 {
return string(p[0:i])
}
}
return string(p)
}
這樣就不會出問題了
新聞標題:go語言數字轉byte go語言byte轉string
新聞來源:http://m.newbst.com/article0/dddojio.html
成都網站建設公司_創新互聯,為您提供小程序開發、關鍵詞優化、虛擬主機、微信小程序、網站維護、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯