上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

golang匿名结构用法与示例

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5085

    回帖

    5959

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5959

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-3-11 20:22:42 | 显示全部楼层 | 阅读模式

    题外话

    有时候一直在纠结
    学技术的意义到底是什么
    我不认为我学的这些东西能让我做一辈子
    20年前可能学个jq学个php
    就可以跟着公司一路水涨船高
    如今人均几十个技术库几个几个框架的学
    最后又赚不了几个逼钱
    起步源码级面试提问
    学习到底有什么意义呢

    原文

    https://www.golinuxcloud.com/golang-anonymous-structs/

    Golang 匿名结构定义及语法

    在之前的文章,我们提到了golang的结构,其中我们简要介绍了匿名结构,现在给你一个简介的概念,匿名结构类型是不使用名字定义的结构,go允许你定义一个匿名字段:结构字段没有自身的名字,只有其类型声明
    一个结构不具有名字将其成为匿名结构,因此,我们无法在代码的其他部分应用该结构,我们可以使用匿名结构定义临时的,短暂存在的接哦古
    例如创建一个匿名结构

    variable_name := struct {
        // fields
    }{field_values}

    如何创建匿名结构

    下方代码展示了如何在go创建一个匿名结构

    package main
    
    import "fmt"
    
    func main() {
        // create anon struct
        person := struct {
            name, nationality string
            age               int
            score             float64
        }{
            name:        "Anna_Hurry",
            nationality: "England",
            age:         21,
            score:       9.5,
        }
        // print anon struct
        fmt.Println(person)
    }

    在这里例子,我们创建了一个匿名结构并立即创建一个结构的实例,代码应该打印出结构的数据

    $ go run main.go
    {Anna_Hurry England 21 9.5}

    如何使用匿名结构在不同类型之间进行比较结构

    结构完全由可比较的类型组成是可以进行比较的,但是结构拥有slice切片或map字段是不可以进行比较的,不同于python或ruby,在go没有任何方法可以复写相等函数为不可比较的结构使==或!=正常工作,当然,你可以写你自己的函数来比较结构。
    在Go中允许执行类型转换在一个结构类型和另一个结构类型中,但是必须两个结构的字段的命名,顺序,和类型完全一致,让我们看看这个问题
    这里我们有一个结构

    type firstPerson struct {
        name string
        age  int
    }

    我们可以使用类型转换将firstPerson转换为secondPerson,但是我们不可以使用==去比较firstPerson和secondPerson的实例,因为他们是完全不同的类型

    type secondPerson struct {
        name string
        age  int
    }

    我们不能使用转换将firstPerson转换为thirdPerson,因为字段是不同的顺序

    type thirdPerson struct {
        age  int
        name string
    }

    我们不能使用转换将firstPerson转换为fourthPerson,因为字段名字不匹配

    type fourthPerson struct {
        firstName string
        age       int
    }

    最终,我们不能转换将firstPerson转换为fifthPerson,因为他有额外的字段

    type fifthPerson struct {
        name          string
        age           int
        favoriteColor string
    }

    匿名结构在这里多出一个小转折:如果两个结构正在被比较和其中至少有一个是匿名类型,如果两个结构的字段,顺序,类型都完全一致,你可以在不进行类型转换的情况下进行比较,你也可以在具名类型和匿名类型之间做相互复制

    package main
    
    import (
        "fmt"
    )
    
    type firstPerson struct {
        name string
        age  int
    }
    
    func main() {
    
        f := firstPerson{
            name: "Bob",
            age:  50,
        }
        var g struct {
            name string
            age  int
        }
    
        // compiles -- can use = and == between identical named and anonymous structs
        g = f
        fmt.Println(f == g)
    }

    输出

    $ go run main.go
    true

    推荐使用匿名结构而不是普通结构的例子

    这里列出推荐的四个用例
    全局组合
    模板数据
    表格测试
    嵌入锁

    全局组合

    我们使用匿名结构将所有的配置变量收集到结构中,所以我们不需要再次引用该匿名结构

    var config struct {
        Username string
        Password string
        APIKey      string
        OAuthConfig oauth.Config
    }

    模板数据

    一个匿名结构可以当作模板数据

    data := struct {
        Title string
        Users []*User
    }{
        title,
        users,
    }

    表格测试

    下方代码演示了如何使用匿名结构去创建表格测试

    var testData = []struct {
        name    string
        age int
        score  float64
    }{
        {"a A x", 12, 5.5},
        {"some_text=some_value", 10, 9.3},
        {"a", 12, 8.2},
        {"ab", 20, 6.7},
    }
    var testData = []struct {
        name    string
        age int
        score  float64
    }{
        {"a A x", 12, 5.5},
        {"some_text=some_value", 10, 9.3},
        {"a", 12, 8.2},
        {"ab", 20, 6.7},
    }
    //do some test here

    嵌入锁

    让互斥体靠近他要保护的数据是一种非常好的做法,如果有必要防止字段发生并发访问,将互斥体作为字段添加到结构中是非常方便的,它为人所知并在很小的程度上使用,但它也很方便它可以,可以将互斥体嵌入到结构中,并且可以调用Lock和Unlock,就好像是结构自身的一部分,看起来像这样

    var hits struct {
        sync.Mutex
        n int
    }
    
    hits.Lock()
    hits.n++
    hits.Unlock()

    概括

    匿名结构就像普通结构一样,但是没有定义名称,因此不能在其他地方引用,匿名结构的语法很简单,我们可以很容易的创建一个匿名结构,在某些情况下,如对全局变量进行组合,创建测试数据表,我们可以使用匿名而不是常规结构

    参考

    https://go.dev/talks/2012/10things.slide#3
    https://pkg.go.dev/sync#Mutex

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    107

    主题

    438

    回帖

    944

    积分

    荣誉开发者

    积分
    944

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2023-3-11 23:52:28 | 显示全部楼层
    加油道哥,虽然我现在不会看,以后可能也不会看。但是你记得要发
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5085

    回帖

    5959

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5959

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-3-12 01:09:37 | 显示全部楼层
    wwwwwllllk 发表于 2023-3-11 23:52
    加油道哥,虽然我现在不会看,以后可能也不会看。但是你记得要发

    谢谢哥哥支持
    另外
    笑到我了
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 685 天

    [LV.9]以坛为家II

    27

    主题

    733

    回帖

    7199

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7199

    荣誉开发者油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-3-12 11:49:15 | 显示全部楼层
    gg也开始学go了吗,又有大腿可以抱了
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5085

    回帖

    5959

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5959

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-3-12 13:10:03 | 显示全部楼层
    Ne-21 发表于 2023-3-12 11:49
    gg也开始学go了吗,又有大腿可以抱了

    还在很基础的位置学习

    想学到开发估计要很久
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    284

    主题

    3810

    回帖

    3739

    积分

    管理员

    积分
    3739

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-3-13 15:48:16 | 显示全部楼层
    woc 二次元
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-1-28 11:21
  • 签到天数: 59 天

    [LV.5]常住居民I

    18

    主题

    101

    回帖

    120

    积分

    中级工程师

    积分
    120
    发表于 2023-3-13 19:08:51 | 显示全部楼层
    学go能用到脚本上吗
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5085

    回帖

    5959

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5959

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-3-13 19:15:26 | 显示全部楼层
    BlenderB 发表于 2023-3-13 19:08
    学go能用到脚本上吗

    用不上
    脚本相关还是主攻js和多读一些源码和设计思想
    我是为了跳槽装全栈
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表