网站默认极速模式,wordpress如何导航网站,网络推广活动具体实施方案,个人备案网站做淘宝客可以往期回顾#xff1a;
Go语言开发小技巧易错点100例#xff08;一#xff09;Go语言开发小技巧易错点100例#xff08;二#xff09;Go语言开发小技巧易错点100例#xff08;三#xff09;Go语言开发小技巧易错点100例#xff08;四#xff09;Go…往期回顾
Go语言开发小技巧易错点100例一Go语言开发小技巧易错点100例二Go语言开发小技巧易错点100例三Go语言开发小技巧易错点100例四Go语言开发小技巧易错点100例五Go语言开发小技巧易错点100例六Go语言开发小技巧易错点100例七
本期看点技巧类用【技】表示易错点用【易】表示
JSON Marshal和Proto Marshal在Protobuf Message结构体上使用的不同【易】channel方式代替time.Sleep()方法【技】
正文开始
JSON Marshal和Proto Marshal在gRPC Message上使用的不同
我们先定义一个Proto Buffer文件内容为一个Message有两个属性其中一个属性为string类型一个为onef类型
syntax proto3;option go_package /test;package cmd;message UserInfo {string name 1;oneof address {string school_addr 2;string home_addr 3;}
}接下来我们编译成pb.go文件
protoc -I. --go_out.. ./hello.proto具体编译后的结构体
type UserInfo struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsName string protobuf:bytes,1,opt,namename,proto3 json:name,omitempty// Types that are assignable to Address:// *UserInfo_SchoolAddr// *UserInfo_HomeAddrAddress isUserInfo_Address protobuf_oneof:address
}// ...type UserInfo_SchoolAddr struct {SchoolAddr string protobuf:bytes,2,opt,nameschool_addr,jsonschoolAddr,proto3,oneof
}// ...type UserInfo_HomeAddr struct {HomeAddr string protobuf:bytes,3,opt,namehome_addr,jsonhomeAddr,proto3,oneof
}然后我们写两个测试方法
方法一JSON Marshl的方式序列化结构体
func TestJSONMarshal(t *testing.T) {u : UserInfo{Name: zs,Address: UserInfo_HomeAddr{HomeAddr: Beijing},}marshal, _ : json.Marshal(u)fmt.Println(string(marshal))var u2 UserInfo_ json.Unmarshal(marshal, u2)fmt.Println(u2)
}结果 方法二Proto Marshal的方式序列化结构体
func TestProtoMarshal(t *testing.T) {u : UserInfo{Name: zs,Address: UserInfo_HomeAddr{HomeAddr: Beijing},}marshal, _ : proto.Marshal(u)fmt.Println(string(marshal))var u2 UserInfo_ proto.Unmarshal(marshal, u2)fmt.Println(u2)
}结果 对比上述的结果我们会发现有些不同
序列化后的内容不同JSON Marshal序列化后的内容可读性较高但是内容占用空间多反序列化时Proto Marshal的方式能够自动识别oneof类型的属性
因此我们得出结论在直接序列化Message时最好使用Proto Marshal的方式进行序列化防止特殊的属性不能够识别而且该序列化的方式更加节省空间缺点则是序列化的结果可读性不高。
channel方式代替time.Sleep()方法
最新发现的新操作直接上代码
func TestSleep(t *testing.T) {-time.After(time.Second) // 相当于time.Sleep(time.Second)}本期到此结束~