Go中匿名结构体的使用技巧

 更新时间:2023年08月21日 08:18:20   作者:网管叨bi叨  
这篇文章主要给大家分享一个使用匿名结构体,提升Go编程效率的小技巧,没什么技术深度,属于在日常写代码过程中积累下来的一个提升自己编程效率的小经验

今天给大家分享一个使用匿名结构体,提升Go编程效率的小技巧,没什么技术深度,属于在日常写代码过程中积累下来的一个提升自己编程效率的小经验。

这个技巧之所以提效率主要体现在两方面:

  • 减少一些不会复用的类型定义
  • 节省纠结该给类型起什么名字的时间

尤其第二项,通过匿名结构体这个名字就能体现出来,它本身就没有类型名,这能节省不少想名字的时间。再一个也能减少起错名字给其他人带来的误解,毕竟并不是所有人编程时都会按照英文的词法做命名的。

下面我先从普通结构体说起,带大家看看什么情形下用匿名结构体会带来编码效率的提升。

具名结构体

具名结构体就是平时用的普通结构体。

结构体大家都知道,用于把一组字段组织在一起,来在Go语言里抽象表达现实世界的事物,类似“蓝图”一样。

比如说定义一个名字为Car的结构体在程序里表示“小汽车”

// 定义结构体类型'car'
type car struct {
    make    string
    model   string
    mileage int
}

用到这个结构体的地方通过其名字引用其即可,比如创建上面定义的结构体的实例

// 创建car 的实例
newCar := car{
    make:    "Ford",
    model:   "taurus",
    mileage: 200000,
}

匿名结构体

匿名结构体顾名思义就是没有名字的结构体,通常只用于在代码中仅使用一次的结构类型,比如

func showMyCar() {
    newCar := struct {
        make    string
        model   string
        mileage int
    }{
        make:    "Ford",
        model:   "Taurus",
        mileage: 200000,
    }
    fmt.Printlb(newCar.mode)
}

上面这个函数中声明的匿名结构体赋值给了函数中的变量,所以只能在函数中使用。

如果一个结构体初始化后只被使用一次,那么使用匿名结构体就会很方便,不用在程序的package中定义太多的结构体类型,比如在解析接口的响应到结构体后,就可以使用匿名结构体

用于解析接口响应

func createCarHandler(w http.ResponseWriter, req *http.Request) {
    defer req.Body.Close()
    decoder := json.NewDecoder(req.Body)
    newCar := struct {
        Make    string `json:"make"`
        Model   string `json:"model"`
        Mileage int    `json:"mileage"`
    }{}
    err := decoder.Decode(&newCar)
    if err != nil {
        log.Println(err)
        return
    }
    ......
    return
}

类似上面这种代码一般在控制层写,可以通过匿名结构体实例解析到请求后再去创建对应的DTO或者领域对象供服务层或者领域层使用。

有人会问为什么不直接把API的响应解析到DTO对象里,这里说一下,匿名结构体的使用场景是在觉得定一个Struct 不值得、不方便的情况下才用的。 比如程序拿到接口响应后需要按业务规则加工下才能创建DTO实例这种情况,就很适合用匿名结构体先解析响应。

比用map更健壮

这里再说一点使用匿名结构体的好处。

使用匿名解析接口响应要比把响应解析到map[string]interface{}类型的变量里要好很多,json数据解析到匿名结构体的时候在解析的过程中会进行类型检查,会更安全。使用的时候直接通过s.FieldName访问字段也比map访问起来更方便和直观。

用于定义项目约定的公共字段

除了上面这种结构体初始化后只使用一次的情况,在项目中定义各个接口的返回或者是DTO时,有的公共字段使用匿名结构体声明类型也很方便。

一般在启动项目的时候我们都会约定项目提供的接口的响应值结构,比如响应里必须包含CodeMsgData三个字段,每个接口会再细分定义返回的Data的结构,这个时候用匿名结构题能节省一部分编码效率。

比如下面这个Reponse的结构体类型的定义

type UserCouponResponse struct {
 Code int64  `json:"code"`
 Msg  string `json:"message"`
 Data []*struct {
  CouponId           int    `json:"couponId"`
  ProdCode           string `json:"prodCode"`
  UserId             int64  `json:"userId"`
  CouponStatus       int    `json:"couponStatus"`
  DiscountPercentage int    `json:"discount"`
 } `json:"data"`
}

就省的先去定义一个UserCoupon类型

type UserCoupon struct {
    CouponId           int    `json:"couponId"`
    ProdCode           string `json:"prodCode"`
    UserId             int64  `json:"userId"`
    CouponStatus       int    `json:"couponStatus"`
    DiscountPercentage int    `json:"discount"`
} 

再在Response声明里使用定义的UserCoupon了

type UserCouponResponse struct {
    Code int64  `json:"code"`
    Msg  string `json:"message"`
    Data []*UserCoupon `json:"data"`
}

当然如果UserCoupon是你的项目其他地方也会用到的类型,那么先声明,顺带在Response结构体里也使用是没问题的,只要会多次用到的类型都建议声明成正常的结构体类型。

还是那句话匿名结构体只在你觉得"这还要定义个类型?”时候使用,用好的确实能提高点代码生产效率。

到此这篇关于Go中匿名结构体的使用技巧的文章就介绍到这了,更多相关Go匿名结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈golang二进制bit位的常用操作

    浅谈golang二进制bit位的常用操作

    这篇文章主要介绍了浅谈golang二进制bit位的常用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言Goroutines 泄漏场景与防治解决分析

    Go语言Goroutines 泄漏场景与防治解决分析

    这篇文章主要为大家介绍了Go语言Goroutines 泄漏场景与防治解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • logrus日志自定义格式操作

    logrus日志自定义格式操作

    这篇文章主要介绍了logrus日志自定义格式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • GO语言基本类型分析

    GO语言基本类型分析

    这篇文章主要介绍了GO语言基本类型,较为详细的分析了整形、浮点型、字符串、指针等类型的具体用法,是深入学习GO语言所必须掌握的重要基础,需要的朋友可以参考下
    2014-12-12
  • go语言中切片Slice与数组Array对比以及panic: runtime error: index out of range问题解决

    go语言中切片Slice与数组Array对比以及panic: runtime error: index out 

    go语言中数组与其他语言有在显著的不同,包括其不能够进行添加,以及值拷贝的特性,下面这篇文章主要给大家介绍了关于go语言中切片Slice与数组Array对比以及panic: runtime error: index out of range问题解决的相关资料,需要的朋友可以参考下
    2022-07-07
  • go语言编程二维码生成及识别

    go语言编程二维码生成及识别

    这篇文章主要为大家介绍了go语言编程二维码的生成及识别示例演示,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • golang Gorm框架讲解

    golang Gorm框架讲解

    gorm是一个使用Go语言编写的ORM框架,这篇文章主要介绍了golang Gorm框架,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Go内置序列化库gob的使用

    Go内置序列化库gob的使用

    本文主要介绍了Go内置序列化库gob的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go源码分析之预分配slice内存

    Go源码分析之预分配slice内存

    这篇文章主要从Go语言源码带大家分析一下预分配slice内存的相关知识,文中的示例代码简洁易懂,对我们深入了解go有一定的帮助,需要的可以学习一下
    2023-08-08
  • Go标准库日志打印及同时输出到控制台与文件

    Go标准库日志打印及同时输出到控制台与文件

    Go语言内置的log包实现了简单的日志服务,下面这篇文章主要给大家介绍了关于Go标准库日志打印及同时输出到控制台与文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论