searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Golang的omitempty关键字注意点

2024-09-29 09:55:04
5
0

GO-SDK顾名思义,就是以golang编写的sdk,它调用OpenAPI采用了json形式。

 

简单来讲就是,用户将struct数据输入到GO-SDK中,先编码成json形式,然后调用OpenAPIOpenAPI在讲该字符串解析成相应的数据结构进行处理,然后通过json返回结果。GO-SDK获取到OpenAPI的响应结果,再解码成struct格式,完成数据的传递。

 

在这过程中,通过Json Marshal将数据编码成json字符串

以查询规格列表为例

type EcsFlavorListRequest struct {

RegionID     *string `json:"regionID,omitempty"`

AzName      *string `json:"azName,omitempty"`

FlavorType    *string `json:"flavorType,omitempty"`

FlavorName    *string `json:"flavorName,omitempty"`

FlavorCPU      *int    `json:"flavorCPU,omitempty"`

FlavorRAM     *int    `json:"flavorRAM,omitempty"`

FlavorArch     *string `json:"flavorArch,omitempty"`

FlavorSeries   *string `json:"flavorSeries,omitempty"`

FlavorID      *string `json:"flavorID,omitempty"`

}

func main() {

//实例化一个数据结构,用于生成json字符串

region_id := test-region

az_name := "test-az"

flavor_type := "test-type"

flavor_name := "test-name"

flavor_cpu := 1

flavor_arch := "test-arch"

flavor_series := "test-series"

flavor_id := "test-id"

 

ecsflavorlist := EcsFlavorListRequest {

RegionID:       ®ion_id,

AzName:       &az_name,

FlavorType:     &flavor_type,

FlavorName:    &flavor_name,

FlavorCpu:      &flavor_cpu,

FlavorArch:     &flavor_arch,

FlavorSeries:    &flavor_series,

FlavorId:       &flavor_id,

}

 

    //Marshal失败时err!=nil

    jsonEcsflavorlist , err := json.Marshal(ecsflavorlist )

    if err != nil {

        fmt.Println("生成json字符串错误")

    }

 

    //jsonStu[]byte类型,转化成string类型便于查看

    fmt.Println(string(jsonEcsflavorlist ))

}

 

在这里有三个关键的点需要注意:

1、omitempty关键字

当在struct中存在某些非必填参数时,用户不传入参数值。比如不传入FlavorCpu的值,且不添加“omitempty”关键字,那运行结果中FlavorCpu会被默认赋值为0,但这并不是我们想要的。我们希望,在传入参数值时被赋值正确的值,不传时也不要输出。这时候就用到了

omitempty”关键字,它来表示这个参数值如果没有提供,在序列化成 json 的时候就不要包含其默认值。

 

2omitempty关键字在嵌套结构体

在开发中嵌套结构体,给EcsFlavorListRequest 增加一个新参数,新的结构体如下:

type EcsFlavorListRequest struct {

RegionID     *string `json:"regionID,omitempty"`

AzName      *string `json:"azName,omitempty"`

FlavorType    *string `json:"flavorType,omitempty"`

FlavorName    *string `json:"flavorName,omitempty"`

FlavorCPU      *int    `json:"flavorCPU,omitempty"`

FlavorRAM     *int    `json:"flavorRAM,omitempty"`

FlavorArch     *string `json:"flavorArch,omitempty"`

FlavorSeries   *string `json:"flavorSeries,omitempty"`

FlavorID      *string `json:"flavorID,omitempty"`

    TestParams    *testParams `json:"testParams,omitempty"`

}

 

type testParams struct {

 Params1  string  `json:"params1"`

 Params2  string  `json:"params2 "`

}

 

 

TestParams作为非必填参数,即使已经给TestParams添加了omitempty关键字,但在输出时还是会给Params1Params2赋值空字符串””,这就是omitempty关键字在嵌套结构体的缺陷,这时的解决办法是给自定义的结构定义为指针类型。

 

3、指针

可以发现上面的结构体的参数不仅自定义结构设置成指针,其他基本类型比如stringintbool等也设置成指针类型。这个是因为当用户给参数赋值为默认值的话,比如int类型参数赋值为0bool类型参数赋值为false,当转为json形式,并不会输出这个参数。这肯定不是我们期待的,这时就用到了指针,将基本数据类型转为指针类型,就可以输出默认值。

0条评论
作者已关闭评论
y****n
5文章数
0粉丝数
y****n
5 文章 | 0 粉丝
原创

Golang的omitempty关键字注意点

2024-09-29 09:55:04
5
0

GO-SDK顾名思义,就是以golang编写的sdk,它调用OpenAPI采用了json形式。

 

简单来讲就是,用户将struct数据输入到GO-SDK中,先编码成json形式,然后调用OpenAPIOpenAPI在讲该字符串解析成相应的数据结构进行处理,然后通过json返回结果。GO-SDK获取到OpenAPI的响应结果,再解码成struct格式,完成数据的传递。

 

在这过程中,通过Json Marshal将数据编码成json字符串

以查询规格列表为例

type EcsFlavorListRequest struct {

RegionID     *string `json:"regionID,omitempty"`

AzName      *string `json:"azName,omitempty"`

FlavorType    *string `json:"flavorType,omitempty"`

FlavorName    *string `json:"flavorName,omitempty"`

FlavorCPU      *int    `json:"flavorCPU,omitempty"`

FlavorRAM     *int    `json:"flavorRAM,omitempty"`

FlavorArch     *string `json:"flavorArch,omitempty"`

FlavorSeries   *string `json:"flavorSeries,omitempty"`

FlavorID      *string `json:"flavorID,omitempty"`

}

func main() {

//实例化一个数据结构,用于生成json字符串

region_id := test-region

az_name := "test-az"

flavor_type := "test-type"

flavor_name := "test-name"

flavor_cpu := 1

flavor_arch := "test-arch"

flavor_series := "test-series"

flavor_id := "test-id"

 

ecsflavorlist := EcsFlavorListRequest {

RegionID:       ®ion_id,

AzName:       &az_name,

FlavorType:     &flavor_type,

FlavorName:    &flavor_name,

FlavorCpu:      &flavor_cpu,

FlavorArch:     &flavor_arch,

FlavorSeries:    &flavor_series,

FlavorId:       &flavor_id,

}

 

    //Marshal失败时err!=nil

    jsonEcsflavorlist , err := json.Marshal(ecsflavorlist )

    if err != nil {

        fmt.Println("生成json字符串错误")

    }

 

    //jsonStu[]byte类型,转化成string类型便于查看

    fmt.Println(string(jsonEcsflavorlist ))

}

 

在这里有三个关键的点需要注意:

1、omitempty关键字

当在struct中存在某些非必填参数时,用户不传入参数值。比如不传入FlavorCpu的值,且不添加“omitempty”关键字,那运行结果中FlavorCpu会被默认赋值为0,但这并不是我们想要的。我们希望,在传入参数值时被赋值正确的值,不传时也不要输出。这时候就用到了

omitempty”关键字,它来表示这个参数值如果没有提供,在序列化成 json 的时候就不要包含其默认值。

 

2omitempty关键字在嵌套结构体

在开发中嵌套结构体,给EcsFlavorListRequest 增加一个新参数,新的结构体如下:

type EcsFlavorListRequest struct {

RegionID     *string `json:"regionID,omitempty"`

AzName      *string `json:"azName,omitempty"`

FlavorType    *string `json:"flavorType,omitempty"`

FlavorName    *string `json:"flavorName,omitempty"`

FlavorCPU      *int    `json:"flavorCPU,omitempty"`

FlavorRAM     *int    `json:"flavorRAM,omitempty"`

FlavorArch     *string `json:"flavorArch,omitempty"`

FlavorSeries   *string `json:"flavorSeries,omitempty"`

FlavorID      *string `json:"flavorID,omitempty"`

    TestParams    *testParams `json:"testParams,omitempty"`

}

 

type testParams struct {

 Params1  string  `json:"params1"`

 Params2  string  `json:"params2 "`

}

 

 

TestParams作为非必填参数,即使已经给TestParams添加了omitempty关键字,但在输出时还是会给Params1Params2赋值空字符串””,这就是omitempty关键字在嵌套结构体的缺陷,这时的解决办法是给自定义的结构定义为指针类型。

 

3、指针

可以发现上面的结构体的参数不仅自定义结构设置成指针,其他基本类型比如stringintbool等也设置成指针类型。这个是因为当用户给参数赋值为默认值的话,比如int类型参数赋值为0bool类型参数赋值为false,当转为json形式,并不会输出这个参数。这肯定不是我们期待的,这时就用到了指针,将基本数据类型转为指针类型,就可以输出默认值。

文章来自个人专栏
golang的语法
1 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0