范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

golang2021面向对象(27)面向对象结构体里的Tag用法

  1. 抛砖引玉:什么是 Tag?
  正常情况下,你定义的结构体是这样子的,每个字段都由名字和字段类型组成
  type  Person struct {
        Name string
        Age   int
        Addr string
    }
  也有例外,就像下面这样子,字段上还可以额外再加一个属性,用反引号(Esc键下面的那个键)包含的字符串,称之为  Tag,也就是标签。
  type  Person struct {
        Name string `json:"name"`
        Age   int    `json:"age"`
        Addr string `json:"addr,omitempty"`
    }
  那么这个标签有什么用呢?
  这边先以 encoding/json  库的用法抛砖引玉,看一下它能起到什么样的效果。
  package  main
  import  (
        "encoding/json"
        "fmt"
    )
  type  Person struct {
        Name string `json:"name"`
        Age   int    `json:"age"`
        Addr string `json:"addr,omitempty"`
    }
  func  main() {
        p1 := Person{
            Name: "Jack",
            Age:  22,
        }
  data1, err := json.Marshal(p1)
        if err != nil {
            panic(err)
        }
  // p1 没有 Addr,就不会打印了
        fmt.Printf("%s ",  data1)
  // ================
  p2 := Person{
            Name: "Jack",
            Age:  22,
            Addr: "China",
        }
  data2, err := json.Marshal(p2)
        if err != nil {
            panic(err)
        }
  // p2 则会打印所有
        fmt.Printf("%s ",  data2)
    }
  由于 Person 结构体里的 Addr 字段有 omitempty 属性,因此 encoding/json  在将对象转化 json 字符串时,只要发现对象里的 Addr 为 false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串中的一种,就会被忽略。
  因此运行后,输出的结果如下
  $ go run demo.go
    {"name":"Jack","age":22}
    {"name":"Jack","age":22,"addr":"China"}
  2. 不懂就问:如何定义获取 Tag ?
  Tag 由反引号包含,由一对或几对的键值对组成,通过空格来分割键值。格式如下
  `key01:"value01"  key02:"value02" key03:"value03"`
  定义完后,如何从结构体中,取出 Tag 呢?
   
  获取 Tag 可以分为三个步骤:
  获取字段       field
  获取标签 tag
  获取键值对 key:value
  演示如下
  // 三种获取 field
    field :=  reflect.TypeOf(obj).FieldByName("Name")
    field :=  reflect.ValueOf(obj).Type().Field(i)  // i 表示第几个字段
    field :=  reflect.ValueOf(&obj).Elem().Type().Field(i)  // i 表示第几个字段
  // 获取 Tag
    tag :=  field.Tag
  // 获取键值对
    labelValue := tag.Get("label")
    labelValue,ok := tag.Lookup("label")
  获取键值对,有Get 和 Lookup 两种方法,但其实 Get 只是对 Lookup  函数的简单封装而已,当没有获取到对应 tag 的内容,会返回空字符串。
  func  (tag StructTag) Get(key string) string {
        v, _ := tag.Lookup(key)
        return v
    }
  空 Tag 和不设置 Tag 效果是一样的
  package  main
  import  (
        "fmt"
        "reflect"
    )
  type  Person struct {
        Name string ``
        Age string
    }
    func main() {
        p := reflect.TypeOf(Person{})
        name, _ := p.FieldByName("Name")
        fmt.Printf("%q ",  name.Tag) //输出  ""
        age, _ := p.FieldByName("Age")
        fmt.Printf("%q ",  age.Tag) // 输出  ""
    }
  3. 实战一下:利用 Tag 搞点事情?
  学会了如何定义 tag 和 获取 tag,可以试着利用 tag 来做一些事情,来练习一下。
  这边我举个例子吧。
  如果我想实现一个函数(就叫 Print 吧),在打印 person 对象时,能够美化输出
  type  Person struct {
        Name        string
        Age         int
        Gender      string
    }
  person := Person{
        Name:        "MING",
        Age:         29,
    }
  Print(person)
  就像下面这样,key 和 value 之间有个 is:,如果没有指定  Gender 的值,那么显示为unknown(未知)。
  Name is: MING
    Age is: 29
    Gender is: unknown
  那该怎么做呢?
  先改造下 Person 结构体,给每个字段加上 tag 标签,三个字段的tag 都有 label 属性,而  Gender 多了一个 default 属性,意在指定默认值。
  type  Person struct {
        Name        string  `label:"Name is: "`
        Age         int    `label:"Age is: "`
        Gender      string  `label:"Gender is: "  default:"unknown"`
    }
  然后来写一下这个 Print 函数
  func  Print(obj interface{}) error {
        // 取 Value
        v := reflect.ValueOf(obj)
  // 解析字段
        for i := 0; i <  v.NumField(); i++ {
  // 取tag
            field :=  v.Type().Field(i)
            tag := field.Tag
  // 解析label 和 default
            label := tag.Get("label")
            defaultValue := tag.Get("default")
  value := fmt.Sprintf("%v", v.Field(i))
            if value == "" {
                // 如果没有指定值,则用默认值替代
                value = defaultValue
            }
  fmt.Println(label + value)
        }
  return nil
    }
  最后执行一下,看了下输出,符合我们的预期:
  $ go run demo.go
    Name is: MING
    Age is: 29
    Gender is: unknown
  到此,我们就把 Tag 的用法介绍完了。

建网站如何匹配最佳域名?域名选择必看如果要建一个自己的网站,那么首先就会碰到一个词域名,相信大家都不陌生了,也在日常上网时使用过无数次,例如google。com。域名结构与工作原理这里为什么没有加上前面我们熟悉的ww做外贸为什么要做好谷歌SEO?使用搜索引擎已成为冲浪者的一种习惯一种生活方式以及获取信息最重要的方式,而谷歌又是全球最大的搜索引擎,这是众所周知的,做谷歌SEO能给网站带来高质量访客,这只是其中一个优势。不知道小屏不再受欢迎?iPhone12mini就是例子,销量最差去年,苹果发布了四款iPhone12,但就实际销量而言,最不受欢迎的是Mini。据多个消息来源称,iPhone2021年上半年的总体生产计划现在修订为7500万部左右,比2020年都2021年了,你还不会用WhatsApp开发客户吗?以上的成功案例还只是沧海一粟。2021,现在很多外贸企业都在用WhatsApp开发客户。为什么呢?想想,好不容易抓到个合适的客户,结果一看,没有邮箱只有电话,这怎么办?打电话吧,国玩转YouTube,让海外客户不请自来HaGro一站式AI智能获客YouTube是Google旗下一个美国的在线视频分享和社交媒体平台。它最初的灵感来自于超级碗中场秀的一场争议,当时短暂地爆出了一个不可描述的事件。而K小米有品再亮性价比屠刀!99元享有2850元质量,米粉快抢对小米有了解的人都知道,小米的身份不仅是手机厂商,其业务还涉及智能家居互联网服务等多项领域,而最近小米也正式进军智能电动汽车行业,打造年轻人第一台电动汽车!多年以来,小米也是种坚持iQOO和小米得小心,realme真我Q3Pro这次来者不善刚刚正式发布的realme真我Q3系列新机,可以说直接点燃了2021年千元机市场的战火。尤其是高配版的realme真我Q3Pro,更是直接成为了新一代的千元机皇,无论是颜值配置功能小米有品448L大容量法式冰箱,7大分区实现家庭小超市自由小米有品448L大容量法式冰箱,7大分区实现家庭小超市自由在所有家电中,冰箱是最容易给人满足感的,打开冰箱的刹那,看到冰箱里井然有序地放着各式食材,幸福感油然而生。容积越大的冰箱,小米申请铁蛋商标的背后,即将进入零食行业一前言小米作为一家以互联网手机起步的企业,目前已经名副其实地变成了世界一流的大型集团,旗下业务不仅包含智能手机智能音箱笔记本电脑智能电视等智能家居产品,还有各种杂七杂八的日常用品,不会拍照的人入手年轻人第一台哈苏是什么体验?今年买手机最大的看点是什么?肯定是影像了。3月份,不少的手机品牌都发布了自家的旗舰机型,而这些机型不约而同的把相机作为了最大的卖点。本人虽然拍照水平一般,但是既然各家都已经提供了最1830万台!明年折叠屏手机市场翻倍增长,专家小米立下汗马功劳自折叠屏问世以来,成为各大手机品牌秀肌肉的舞台,但由于折叠屏科研投入大,导致只有少数大厂有能力,有资金,有技术,去研制折叠屏手机,因而折叠屏手机的更新频率较低,没有良好的市场竞争氛
工业机器人领域最常用的六大传感器随着工业机器人技术的不断发展,机器人不再只是那个搬运重物的工具,传感器技术的应用,让工业机器人变得智能了许多,传感器为机器人增加了感觉,为机器人高精度智能化的工作提供了基础。下面就限免2019年苹果精选iOS限免20190309每天会有许多软件进行限时免费活动,小编挑选一些实用的软件与大家分享。今日3。09,女神节后第一天的限时免费软件推荐,大家看看有适合自己的吗?如需下载请复制软件名到AppStore中5G时代,中国联通或将进一步落后随着5G即将商用,三大运营商均摩拳擦掌的准备大干一番,柏颖科技认为在中国联通和中国电信之中,中国电信最有机会挑战中国移动,而中国联通或将进一步落后。3G和4G时代,中国电信表现优于3月7日马云退出了阿里旗下五家公司,这事你怎么看?谢谢您的问题。阿里巴巴说马云退出不是事实,但是从中也反映出一些问题。阿里巴巴辟谣的话说三遍。网上说马云退出的事主要来自于天眼查询,数据显示马云于3月7日退出了阿里旗下阿里巴巴(中国添加BlackmagicRAW,Blackmagic发布PocketCinemaCamera4K口袋视频机全新固件Blackmagic发布PocketCinemaCamera4K口袋视频机全新固件,添加BlackmagicRAWBlackmagicDesign宣布于今日发布Blackmagic索尼不再是信仰!新机国行售2799安卓最窄下巴侧面指纹解锁MWC2019世界移动大会是全球厂商们竞技的舞台,最新最前沿的技术都会在这里首发和展示给全球的媒体及用户,其次,MWC也是年初新机发布的一个集中时期,日本科技公司,素有信仰之称的索东芝与西数正在研发128层堆叠3DTLC,写入速度翻倍来源超能网今年64层堆叠的3DTLC闪存已经是SSD市场的绝对主流,用96层堆叠闪存的SSD也开始上市了,厂商们已经向更高层的128层堆叠进军,在年初的2019闪存峰会上SK海力士全球首个轨道交通转向架智能制造车间投产新华社北京3月8日电(记者阳建)全国人大代表中车株洲电力机车有限公司董事长周清和8日说,全球首个轨道交通转向架智能制造车间已于两会期间在该公司投产运行,相比传统人工操作模式,人员精Firefox67将引入反指纹跟踪技术Mozilla计划在今年5月中旬推出的Firefox67中添加新的用户反指纹技术。所谓的指纹技术,指的是基于Html5的Canvas指纹跟踪技术。所谓的指纹是指每一种浏览器都会使用ABB将面临架构重组?近日,世界500强企业ABB公布了公司的第四季度业绩,在2018年最后的三个月里,ABB总营收达到74亿美元,同比2017年的第四季增长了9。不过,该季度利润只有3。17亿美元,相从RSA的创新大赛中看数据资产管理当前万众瞩目的RSA会议中,创新沙盒比赛令人关注,它引领着信息安全的风向标。10家入围安全厂商涵盖了各种技术,包括资产管理DevOps云安全数据安全和固件安全等。从今年创新沙盒比赛