背景

最近研究钉钉机器人的时候,总是会向钉钉官方接口发送很多请求,发送请求的时候,需要封装body结构体传递参数,还要封装response结构体用来接收返回值,有时候,response结构体中还要嵌套一些结构体,这些结构体大多知识在请求的时候能用到,到了其他位置则是没有任何用途。 在声明了一个又一个的结构体后,我发现,这是一个很麻烦的事情,首先是代码很多,显得有点乱,其次是,结构体直接跳转的时候也不是很方便。 然后我们了解了匿名结构体和结构体嵌套,下面来一起看看吧。

具体实现

先看一个没有匿名结构体和结构体嵌套的代码。

//批量获取考勤组
func GetAttendancesGroups(token string, offset int, size int) (groups []dingding.DingAttendGroup, err error) {var client *http.Clientvar request *http.Requestvar resp *http.Responsevar body []byteURL := "https://oapi.dingtalk.com/topapi/attendance/getsimplegroups?access_token=" + tokenclient = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置TLSClientConfig: &tls.Config{InsecureSkipVerify: true,},}, Timeout: time.Duration(time.Second * 5)}//此处是post请求的请求题,我们先初始化一个对象b := BodyGetAttendancesGroups{Offset: offset,Size:   size,}//然后把结构体对象序列化一下bodymarshal, err := json.Marshal(&b)if err != nil {return}//再处理一下reqBody := strings.NewReader(string(bodymarshal))//然后就可以放入具体的request中的request, err = http.NewRequest(http.MethodPost, URL, reqBody)if err != nil {return}resp, err = client.Do(request)if err != nil {return}defer resp.Body.Close()body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]if err != nil {return}r := ResponseGetAttendancesGroups{}//把请求到的结构反序列化到专门接受返回值的对象上面err = json.Unmarshal(body, &r)if err != nil {return}if r.Errcode != 0 {return nil, errors.New("token有误,尝试输入新token")}// 此处举行具体的逻辑判断,然后返回即可r.Result.Groups = groupsreturn groups, nil
}
//传递body参数的结构体
type BodyGetAttendancesGroups struct {Offset int `json:"offset"`Size   int `json:"size"`
}
//接收response返回值的结构体
type ResponseGetAttendancesGroups struct {Errcode int                        `json:"errcode"`Result  ResultGetAttendancesGroups `json:"result"`
}
type ResultGetAttendancesGroups struct {Groups []DingAttendGroup `json:"groups"`
}
type DingAttendGroup struct {GroupId       int      `json:"group_id"`      //考勤组idGroupName     string   `json:"group_name"`    //考勤组名称MemberCount   int      `json:"member_count"`  //参与考勤人员总数WorkDayList   []string `json:"work_day_list"` //0表示休息,数组内的值,从左到右依次代表周日到周六,每日的排班情况。ClassesList   []string `json:"classes_list"`  // 一周的班次时间展示列表SelectedClass []struct {Setting struct {PermitLateMinutes int `json:"permit_late_minutes"` //允许迟到时长} `json:"setting"`Sections []struct {Times []struct {CheckTime string `json:"check_time"` //打卡时间CheckType string `json:"check_type"` //打卡类型} `json:"times"`} `json:"sections"`} `json:"selected_class"`
}

上面的代码其实不是我最初的原版代码,可以最后一个结构体,其实我已经使用了嵌套结构体,把很多的结构体,全部写在一起,这样的话,组成一个大大的结构体,代码就不会显得冗余了,所有有关系的结构体都被紧紧的绑定在了一起。上面就是结构体嵌套的好处。

除了结构体嵌套,还有就是匿名结构体,匿名结构体的意思就是,没有具体名称的结构体,用途就是,只使用一次,后续其他地方也用不到了。 这不就完全符合用来接收钉钉官方接口返回的参数,出了这个接口请假内部就再也用不到了。 所有下方代码,就是使用结构体嵌套和匿名结构体后的代码,能够封装一个很强的网络请求,所有需要的结构体全部都封装在一个方法里面。

//此结构体是公用的,需要定义在外面
type DingAttendGroup struct {GroupId       int      `json:"group_id"`      //考勤组idGroupName     string   `json:"group_name"`    //考勤组名称MemberCount   int      `json:"member_count"`  //参与考勤人员总数WorkDayList   []string `json:"work_day_list"` //0表示休息,数组内的值,从左到右依次代表周日到周六,每日的排班情况。ClassesList   []string `json:"classes_list"`  // 一周的班次时间展示列表SelectedClass []struct {Setting struct {PermitLateMinutes int `json:"permit_late_minutes"` //允许迟到时长} `json:"setting"`Sections []struct {Times []struct {CheckTime string `json:"check_time"` //打卡时间CheckType string `json:"check_type"` //打卡类型} `json:"times"`} `json:"sections"`} `json:"selected_class"`
}
//此结构体是公用的,需要定义在外面
type DingResponseCommon struct {Errcode int `json:"errcode"`Errmsg string `json:"errmsg"`
}
//批量获取考勤组
func (a *DingAttendGroup) GetAttendancesGroups(token string, offset int, size int) (groups []DingAttendGroup, err error) {var client *http.Clientvar request *http.Requestvar resp *http.Responsevar body []byteURL := "https://oapi.dingtalk.com/topapi/attendance/getsimplegroups?access_token=" + tokenclient = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置TLSClientConfig: &tls.Config{InsecureSkipVerify: true,},}, Timeout: time.Duration(time.Second * 5)}//此处是post请求的请求题,我们先初始化一个匿名结构体对象b := struct {Offset intSize   int}{Offset: offset,Size:   size,}//然后把结构体对象序列化一下bodymarshal, err := json.Marshal(&b)if err != nil {return}//再处理一下reqBody := strings.NewReader(string(bodymarshal))//然后就可以放入具体的request中的request, err = http.NewRequest(http.MethodPost, URL, reqBody)if err != nil {return}resp, err = client.Do(request)if err != nil {return}defer resp.Body.Close()body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]if err != nil {return}//初始化一个匿名结构体对象,里面使用了结构体嵌套r := struct {DingResponseCommonResult struct {Groups []DingAttendGroup `json:"groups"`} `json:"result"`}{}//把请求到的结构反序列化到专门接受返回值的对象上面err = json.Unmarshal(body, &r)if err != nil {return}if r.Errcode != 0 {return nil, errors.New("token有误,尝试输入新token")}// 此处举行具体的逻辑判断,然后返回即可r.Result.Groups = groupsreturn groups, nil
}

好了,这是一个写了很久代码之后,才发现的好方法,希望能帮到你,感谢批评指正。

Golang匿名结构体结构体嵌套(实战使用)相关推荐

  1. golang怎么给空结构体赋值

    一.前言 最近没少使用golang,也没经过系统的学习,直接就上去开发了,遇到不少坑也学到不少东西,本次记录下给空结构体赋值的问题. 二.案例 1.结构体结构及错误 type Test struct ...

  2. 换个语言学一下 Golang (9)——结构体和接口

    换个语言学一下 Golang (9)--结构体和接口 基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就 ...

  3. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  4. C++结构体 结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数

    C++结构体 第二章 C++结构体 1.结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体 ...

  5. 用结构体指针访问结构体中的结构体指针(结构体指针的嵌套)

    结构体中的结构体指针是使用 一.问题背景 二.代码 三.说明 一.问题背景   日常工作中没有编程的机会,所以只看得懂代码,现在需要重新写一段代码,实现固定格式存储数据,需要使用到结构体和结构体指针. ...

  6. c语言结构体共用体枚举实例程序,10-C语言结构体-共用体-枚举

    结构体是什么? 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的,而结构体是用于保存一组不同类型的数组 定义结构体 在使用结构体之前必须先定义结构体类型,因为C语言不知道你的结构体中需要 ...

  7. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

    结构体 结构体的形式 struct 结构体名称 { 结构体成员1; 结构体成员2; - }; 例如: 图书的结构体 struct Book {char title[128];char author[4 ...

  8. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  9. 如何通过结构化智能体完成物理构造任务?| 技术头条

    作者 | Victor Bapst, Alvaro Sanchez-Gonzalez,Carl Doersch, Kimberly L. Stachenfel 译者 | Linstancy 编辑 | ...

最新文章

  1. Java VS .Net 程序员的困惑 (转)
  2. ACL-文件访问控制列表
  3. html5 打印api,HTML5的API(一)
  4. NumPy 基础用法
  5. MFC开发IM--MFC非模态对话框的创建及显示
  6. c语言400行小游戏,400行代码编C语言控制台界版2048游戏,编写疯子一样的C语言代码...
  7. Exploring Ionic Lists
  8. 大数据开发笔记(四):Hive分区详解
  9. VB 6.0使用api
  10. sonarqube如何导入规则_webpack如何使用Vue
  11. kali linux 无线攻击——aircrack-ng
  12. [Unity小游戏]打砖块(打方块)教程(超详细)
  13. magento 开发 -- 入门深入理解第五章 – Magento资源配置
  14. 计算机基础知识(基础入门小白专属)四
  15. vue项目,报错This is probably not a problem with npm,there is likely additional logging output above
  16. 一种喷涂有可吸收电磁波的水性油漆的飞机外壳
  17. 用scratch编写游戏2048(印章法)
  18. openstack neutron介绍
  19. 2022年货节有什么好买的?新年好物选购清单
  20. 安装Windows10时遇到的0x80300024错误

热门文章

  1. 扫码自助饮料机真的能够完善市场吗?点赋科技预测
  2. 从前端页面到获取数据库的数据,需要哪些步骤?一个项目的起步。初学者可以来瞧瞧哇~
  3. 2016年中国智慧城市建设28个关键领域
  4. oracle nvarchar2 substr,关于oracle中varchar2与nvarchar2的一点认识 - Qxun_dream
  5. Excel催化剂开源第43波-Excel选择对象Selection在.Net开发中的使用
  6. 【UE】更改鼠标光标
  7. Python免费教程,学了都说好!
  8. java instance_java关于instance的定义
  9. 从远程计算机获取WMI数据
  10. 护士医生工作汇报PPT-朴尔PPT