您的位置:

golang序列化pb,golang序列化对比

本文目录一览:

golang中级进阶(二):结构体

目录

一、结构体详解

1. 结构体定义

2. 实例化结构体的7种方法

二、结构体方法

1. 结构体的方法定义

2. 结构体内自定义方法的引用

3. 任意类型添加方法

三、嵌套、继承

1. 匿名结构体

2. 结构体中可以定义任意类型的字段

3. 结构体嵌套结构体

4. 结构体嵌套匿名结构体

5. 结构体嵌套多个匿名结构体

6. 结构体继承

四、结构体和JSON相互转换

1. 结构体转化成json

2. json转化成结构体

3. 结构体标签 tag

4. 嵌套结构体和json的序列化反序列化

Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。

Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全 部或部分属性时,这时候再用单一的基本数据类型就无法满足需求了,Golang 提供了一种 自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct。 也就是我们可以通过 struct 来定义自己的类型了。

使用 type 和 struct 关键字来定义结构体,具体代码格式如下:

type 类型名 struct {

字段名 字段类型

字段名 字段类型 …

}

其中:

• 类型名:表示自定义结构体的名称,在同一个包内不能重复。

• 字段名:表示结构体字段名。结构体中的字段名必须唯一。

• 字段类型:表示结构体字段的具体类型。

在 go 语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法。所谓方法 就是定义了接收者的函数。接收者的概念就类似于其他语言中的 this 或者 self。

方法的定义格式如下:

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {

函数体

}

注意:想改变结构体内的值,必须先变成指针。

在 Go 语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。 举个例子,我们基于内置的 int 类型使用 type 关键字可以定义新的自定义类型,然后为我们 的自定义类型添加方法。

注意:匿名结构体中不允许出现多个重复的类型

注意:如果结构体里面有私有属性也就是小写定义的字段,则不会被json使用

golang 中结构体与字节数组能相互转化么

如果你的意思是byte的json串的话可以用json.Unmarshal()啊,大概意思就是这个吧,如果不嫌麻烦,用reflect可以把byte按自己的想法解析进结构体,就是麻烦点

Golang中的自定义json序列化

后端开发人员跟前端对接接口的时候,或多或少都会面临一些沟通问题,比如说枚举字符的定义,比如有整形状态字段: state

通常给前端的时候,前段要做的是将1,2,3以及对应的中文释义存储为key/value的形式,key与value单看都无法知道对方的语义,

比如我只知道状态值为“1”, 是无法将其与“成功”对应起来的(当然这套状态的设计者肯定是知道的),后端通常给到前端的restful api

接口定义也是key/value的形式,这乍一看其实也没啥毛病,只要有key/value也没问题,后端定义通常会是

但数字的表现形式终归是不不太明确的,如果对状态的定义换成以下形式:

基本可以理解为中英文互译了,理解起来也会更清晰一些不是,如果这么做的话,后端给到前端的响应字段状态的类型就需要修改成字符器格式

后端还是要做一层字符串到整型的转换,从目的来讲,我们只是想返给前端的 state 字段是字符串而已,也就是在做json序列化的时候将整型与字符串做一层转换,有更优雅的做法如下所示

只需要做两件事,自定义类型 MyState ,实现 MarshalJSON 方法

只要类型实现了 MarshalJSON 方法,在json序列化时就会调用此方法,如此一来,我们就轻松实现了自定义json序列化,反序列化同样如此

实现起来也很简单

需要注意的是, UnmarshalJSON 方法操作过程需要给 receiver 也就是 u 赋值,所以必须是指针类型,同样的,在实现

MarshalJSON 方法, receiver 的类型需要与结构体定义中的类型保持一致,否则自定义序列化会失败

参考:

GRPC的HTTP返回值int64被转为string类型

最近在使用http接口访问一个GRPC的服务时遇到一个数据类型转换的问题。一个时间戳字段在PB中定义的字段类型为uint64,返回到本地之后却是一个string类型,在我用uint64去接收这个字段时报了错。

为什么GRPC要把int64转为string类型呢,他们的回答是遵循proto3的序列化规则,proto3的json-mapping中规定了int64/uint64/fixed64类型映射的json类型为string。如图:(PB文档地址: )

很多人都质疑PB的这个行为,然而这并不能改变什么,下面是一个关于该问题的回答,大意就是:JS使用了52bit去实现IEEE754的双精度数,也就是说js在不丢失信息的情况下最大能表示的数是 2^52 。64位的数在JS中直接使用是会有问题了。PB为了客户端能正常处理数据而把64位数值直接转换为了string类型。

本人使用的是golang语言,在处理http返回值时,使用jsonpb包代替了json包去解析返回的二进制数据。不过解析出来的是message格式的,用的时候还需要进一步加工处理,相比较与转换string类型到int64,感觉还是简单一点。