Go語言是一種開源的編程語言,被廣泛應(yīng)用于網(wǎng)絡(luò)編程、云計(jì)算、分布式系統(tǒng)等領(lǐng)域。

“真誠服務(wù),讓網(wǎng)絡(luò)創(chuàng)造價(jià)值”是我們的服務(wù)理念,創(chuàng)新互聯(lián)建站團(tuán)隊(duì)10余年如一日始終堅(jiān)持在網(wǎng)站建設(shè)領(lǐng)域,為客戶提供優(yōu)質(zhì)服。不管你處于什么行業(yè),助你輕松跨入“互聯(lián)網(wǎng)+”時(shí)代,PC網(wǎng)站+手機(jī)網(wǎng)站+公眾號(hào)+成都小程序開發(fā)。
go語言的三位作者
Go語言的設(shè)計(jì)目標(biāo)是成為一種語法簡(jiǎn)潔、執(zhí)行效率高、并發(fā)性能強(qiáng)大的編程語言。它由Google公司研發(fā),于2009年首次發(fā)布,并于2012年成為了開源項(xiàng)目。Go語言具有C語言的表達(dá)能力和Python的開發(fā)效率,同時(shí)還擁有自己獨(dú)特的語法和特性,如協(xié)程、垃圾回收機(jī)制等。因此,它被廣泛應(yīng)用于網(wǎng)絡(luò)編程、云計(jì)算、分布式系統(tǒng)等領(lǐng)域,并且越來越受到開發(fā)者的青睞。
Go語言的出現(xiàn),填補(bǔ)了許多編程語言在并發(fā)編程方面的空缺。它提供了一種輕量級(jí)線程模型,通過協(xié)程(goroutine)的方式,實(shí)現(xiàn)了高效的并發(fā)編程。同時(shí),Go語言還支持內(nèi)置的網(wǎng)絡(luò)編程和字節(jié)序列編解碼庫,使得網(wǎng)絡(luò)編程變得更加容易和高效。在云計(jì)算、分布式系統(tǒng)等領(lǐng)域,Go語言也得到了廣泛的應(yīng)用。例如,Docker和Kubernetes等開源項(xiàng)目就是用Go語言開發(fā)的。此外,Go語言還具有代碼可讀性高、編譯速度快、編譯后的可執(zhí)行文件體積小等優(yōu)點(diǎn),使得它成為了開發(fā)高性能、高并發(fā)應(yīng)用的理想語言之一。
Go中的binary包實(shí)現(xiàn)了簡(jiǎn)單的數(shù)字與字節(jié)序列的轉(zhuǎn)換以及變長(zhǎng)值的編解碼
package main
import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲(chǔ) LittleEndian小端順序存儲(chǔ) 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) //操作的都是無符號(hào)整型 binary.BigEndian.PutUint32(data,uint32(n))
可以使用下面的方式判斷當(dāng)前系統(tǒng)的字節(jié)序類型
const INT_SIZE int = int(unsafe.Sizeof(0))
//判斷我們系統(tǒng)中的字節(jié)序類型 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") } }
后端開發(fā)人員跟前端對(duì)接接口的時(shí)候,或多或少都會(huì)面臨一些溝通問題,比如說枚舉字符的定義,比如有整形狀態(tài)字段: state
通常給前端的時(shí)候,前段要做的是將1,2,3以及對(duì)應(yīng)的中文釋義存儲(chǔ)為key/value的形式,key與value單看都無法知道對(duì)方的語義,
比如我只知道狀態(tài)值為“1”, 是無法將其與“成功”對(duì)應(yīng)起來的(當(dāng)然這套狀態(tài)的設(shè)計(jì)者肯定是知道的),后端通常給到前端的restful api
接口定義也是key/value的形式,這乍一看其實(shí)也沒啥毛病,只要有key/value也沒問題,后端定義通常會(huì)是
但數(shù)字的表現(xiàn)形式終歸是不不太明確的,如果對(duì)狀態(tài)的定義換成以下形式:
基本可以理解為中英文互譯了,理解起來也會(huì)更清晰一些不是,如果這么做的話,后端給到前端的響應(yīng)字段狀態(tài)的類型就需要修改成字符器格式
后端還是要做一層字符串到整型的轉(zhuǎn)換,從目的來講,我們只是想返給前端的 state 字段是字符串而已,也就是在做json序列化的時(shí)候?qū)⒄团c字符串做一層轉(zhuǎn)換,有更優(yōu)雅的做法如下所示
只需要做兩件事,自定義類型 MyState ,實(shí)現(xiàn) MarshalJSON 方法
只要類型實(shí)現(xiàn)了 MarshalJSON 方法,在json序列化時(shí)就會(huì)調(diào)用此方法,如此一來,我們就輕松實(shí)現(xiàn)了自定義json序列化,反序列化同樣如此
實(shí)現(xiàn)起來也很簡(jiǎn)單
需要注意的是, UnmarshalJSON 方法操作過程需要給 receiver 也就是 u 賦值,所以必須是指針類型,同樣的,在實(shí)現(xiàn)
MarshalJSON 方法, receiver 的類型需要與結(jié)構(gòu)體定義中的類型保持一致,否則自定義序列化會(huì)失敗
參考:
是數(shù)據(jù)。根據(jù)查詢知乎顯示golang序列化是在內(nèi)存中把數(shù)據(jù)轉(zhuǎn)換成指定格式(data-string),反之亦然(string-datastructure)編碼也是一樣的。序列化(Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。
分享題目:go語言序列 go語言排序算法
標(biāo)題鏈接:http://chinadenli.net/article0/ddgcgoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、App設(shè)計(jì)、商城網(wǎng)站、網(wǎng)站維護(hù)、軟件開發(fā)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)