Go 语言入门,不少人从实现网络服务起步。数据传输是一道必过的坎。今天说一说 Go 里的 Gob 怎么用来传数据。动手前,心里先有个数。
Gob 是 Go 语言自己的序列化方式。啥是序列化?说得直白点,就是把内存里的对象变成一串字节,发出去。别人接到后,能原样还原。在分布式系统、缓存系统里常用。至于为何用 Gob,不为啥,就因为它直接内置,简单省事。
先来点基础准备。定义个结构体。假设我们在弄用户信息,姓名、年龄。别废话,看代码:
go
type User struct {
Name string
Age int
}
有了数据结构,数据咋发?又咋收?简单,Gob 提供编码和解码,咱逐一试。
编码!发出去之前先变身:
go
// 先搞个 buffer 用来存字节
var network bytes.Buffer
// 新建个 encoder
encoder := gob.NewEncoder(&network)
// 实例个 User
user := User{Name: "张三", Age: 25}
// 开始编码!将 user 序列化后,存到 network 里
encoder.Encode(user)
一旦变成 bytes,网络对面,接收的一端正等着还原它。这就要 解码!数据得复原:
go
// network 里的字节流发到对端,假设他接到啦
var receivedUser User
// 新建 decoder,依然传入 buffer
decoder := gob.NewDecoder(&network)
// 将收到的字节流解码,重新还原出 User 对象
decoder.Decode(&receivedUser)
// 验证下对不对,看看名字、年龄
fmt.Println("收到用户:", receivedUser.Name, receivedUser.Age)
你自己尝试,也可以弄复杂些,传数组、传复杂对象,本质相差不大。重点要关注啥?类型匹配!发出去时啥类型,收的时候务必对上,不然人家不认识。曾经一次我不小心用错了类型,Gob 冷笑一声,抛了个错误给我。别图快,悠着来,步步小心。
带交互的收发也不麻烦。比如你服务端要接多个客户,好的连接传递常见个例子:类似上面说的流程,无非套上一层循环,等待源源不断请求。又或者客户端是发起请求的一方,凭你安排。调整各式角色不难,会了单个 Gob,其余你自己任意组合玩出花样。