GO-SDK顾名思义,就是以golang编写的sdk,它调用OpenAPI采用了json形式。
简单来讲就是,用户将struct数据输入到GO-SDK中,先编码成json形式,然后调用OpenAPI。OpenAPI在讲该字符串解析成相应的数据结构进行处理,然后通过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 的时候就不要包含其默认值。
2、omitempty关键字在嵌套结构体
在开发中嵌套结构体,给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关键字,但在输出时还是会给Params1和Params2赋值空字符串””,这就是omitempty关键字在嵌套结构体的缺陷,这时的解决办法是给自定义的结构定义为指针类型。
3、指针
可以发现上面的结构体的参数不仅自定义结构设置成指针,其他基本类型比如string、int、bool等也设置成指针类型。这个是因为当用户给参数赋值为默认值的话,比如int类型参数赋值为0,bool类型参数赋值为false,当转为json形式,并不会输出这个参数。这肯定不是我们期待的,这时就用到了指针,将基本数据类型转为指针类型,就可以输出默认值。