前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang如何创建动态的struct类型以及如何转换成slice类型

golang如何创建动态的struct类型以及如何转换成slice类型

作者头像
公众号-利志分享
发布2022-04-25 09:00:03
3.4K0
发布2022-04-25 09:00:03
举报
文章被收录于专栏:利志分享

最近研究了一下reflect包,感觉这个包的功能很强大,顺便研究了一下如何在函数中动态创建struct{},平常我们都是用如下方式定义struct类型。

代码语言:javascript
复制
type TmpStuct struct {
  Height float64 `json:"height"`
  Age    int     `json:"age"`
  Test   int     `json:"test"`
}

这种情况下是我们知道里面的字段和tag属性,我们才能定义好这个结构。如果我们有时候读不同的数据库不同的数据表,事先我们又不确定这些数据表的字段,但是数据表是存在另外一个地方,这个时候我们需要动态创建struct类型来临时建类型,以及设置对应的tag和执行的sql进行绑定,这样才能从数据库把对应的数据表读出来。

下面我们看下如何通过reflect来实现建struct类型。

比如我们要建一个带有Height,Age,Test三个字段的结构。

代码语言:javascript
复制
package main

import (
  "fmt"
  "reflect"
)

func main() {
  tmpStuct := []reflect.StructField{
    {
      Name: "Height",
      Type: reflect.TypeOf(float64(0)),
      Tag:  `json:"height"`,
    },
    {
      Name: "Age",
      Type: reflect.TypeOf(int(0)),
      Tag:  `json:"age"`,
    },
    {
      Name: "Test",
      Type: reflect.TypeOf(int(0)),
      Tag:  `json:"test"`,
    },
  }
  typ := reflect.StructOf(tmpStuct)
  fmt.Printf("%v", typ)
}

上面的代码执行的结果如下:

代码语言:javascript
复制
struct { Height float64 "json:\"height\""; Age int "json:\"age\""; Test int "json:\"test\"" }

上面是动态创建了struct类型,创建这个类型可以用于绑定查询单个sql,查询sql我们很多时候也有批量查询的需求,我们如何把上面的定义的struct又转换成slice呢?我们接下来看下下面的代码

代码语言:javascript
复制
package main

import (
  "fmt"
  "reflect"
)

func main() {
  tmpStuct := []reflect.StructField{
    {
      Name: "Height",
      Type: reflect.TypeOf(float64(0)),
      Tag:  `json:"height"`,
    },
    {
      Name: "Age",
      Type: reflect.TypeOf(int(0)),
      Tag:  `json:"age"`,
    },
    {
      Name: "Test",
      Type: reflect.TypeOf(int(0)),
      Tag:  `json:"test"`,
    },
  }
  typ := reflect.StructOf(tmpStuct)
  fmt.Printf("%v\n", typ)
  //下面是把typ转换成[]typ slice结构
  tSlice := reflect.MakeSlice(reflect.SliceOf(typ), 0, 0)
  tmp := reflect.New(tSlice.Type()).Elem().Addr().Interface()
  fmt.Printf("%+v", reflect.TypeOf(tmp).Elem())
}

上面代码执行结果如下:

代码语言:javascript
复制
struct { Height float64 "json:\"height\""; Age int "json:\"age\""; Test int "json:\"test\"" }
[]struct { Height float64 "json:\"height\""; Age int "json:\"age\""; Test int "json:\"test\"" }

slice的创建我们还是通过reflect来实现。通过makeslice函数来处理,这样就能创建这个slice了。

好了,到这里我们就先简单讲完动态创建stuct类型以及当前struct转换成slice的案例。等后面有时候我研究透relect函数,讲讲relect函数的原理实现。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档