Go语言匿名结构体

一文读懂Go匿名结构体使用场景 一文读懂Go匿名结构体使用场景 前言 匿名行为在go语言里非常常见,比如: 匿名函数:也就是我们熟知的闭包(Closure) 结构体里的匿名字段(Anonymous Fields) 匿名结构体(Anonymous Structs) 匿名行为的设计带来了一些理解上的困难,但是熟悉了匿名设计的使用后,你会发现匿名设计在某些特定场景可以帮助大家写出更简洁、更优雅、更高效和更安全的代码。 什么是匿名结构体 匿名结构体:顾名思义,就是结构体没有命名。比如下面的代码示例: // 阅读详情

Go 语言中的匿名结构体是一种非常有用的编程技巧,它可以帮助我们实现代码复用、结构清晰等目标。

什么是匿名结构体?

首先,我们需要了解什么是结构体。在 Go 语言中,结构体是一种自定义的数据类型,可以由多个字段组成。结构体的定义如下:

type Person struct {
    Name string
    Age  int
}

这里我们定义了一个 Person 结构体,它由两个字段组成,分别是 Name 和 Age。我们可以通过以下方式来创建一个 Person 类型的变量:

var p Person
p.Name = "John"
p.Age = 20

当我们需要在一个结构体中嵌入另一个结构体时,通常使用结构体的字段来实现。例如:

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

这里我们定义了两个结构体,分别是 Address 和 Person,并且在 Person 结构体中嵌入了 Address 结构体。这样我们就可以通过 p.Address.Province 等方式来访问 Person 结构体中的 Address 字段了。

但是,如果我们只需要使用 Address 结构体中的部分字段,或者只是想在 Person 结构体中嵌入一个临时的结构体,这时候我们就可以使用匿名结构体了。

匿名结构体是指没有定义名称的结构体,我们可以直接在其它结构体的字段中定义。示例代码如下:

type Person struct {
    Name string
    Age  int
    struct {
        Province string
        City     string
    }
}

这里我们定义了一个 Person 结构体,其中包含了一个匿名结构体。这个匿名结构体中有 Province 和 City 两个字段。我们可以像这样来创建一个 Person 类型的变量:

var p Person
p.Name = "John"
p.Age = 20
p.Province = "Zhejiang"
p.City = "Hangzhou"

可以看到,我们可以直接通过 p.Province 和 p.City 来访问 Person 结构体中的 Province 和 City 字段了,这样就可以省略 Address 结构体的定义了。

匿名结构体的特点

匿名结构体有以下几个特点:

  1. 匿名结构体没有名称,只能在其它结构体中使用。
  2. 匿名结构体可以包含任意类型的字段,包括基本类型、结构体、函数等。
  3. 匿名结构体可以被嵌套在其它结构体中。
  4. 匿名结构体的字段可以直接访问,不需要通过结构体名称。

匿名结构体的用法

匿名结构体的主要用途是在临时场景中使用,可以减少代码量,使代码更加简洁。下面是一些使用匿名结构体的示例代码:

示例一:定义临时结构体

有时候我们可能只需要使用一个结构体中的几个字段,并且不想为这个结构体单独定义一个名称,这时候就可以使用匿名结构体了。示例代码如下:

func main() {
    p := struct {
        Name string
        Age  int
    }{
        Name: "John",
        Age:  20,
    }
    fmt.Println(p)
}

这里我们定义了一个临时的结构体,其中包含了 Name 和 Age 两个字段。我们可以直接在定义时初始化这个结构体,并且可以直接访问其字段。

示例二:继承结构体

在某些情况下,我们可能会需要从一个结构体中继承一些字段,但是又不想为这个继承的结构体单独定义一个名称。这时候就可以使用匿名结构体了。示例代码如下:

type Person struct {
    Name string
    Age  int
}

type Student struct {
    Person
    Grade string
}

func main() {
    s := Student{
        Person: Person{
            Name: "John",
            Age:  20,
        },
        Grade: "A",
    }
    fmt.Println(s.Name, s.Age, s.Grade)
}

这里我们定义了一个 Person 结构体和一个 Student 结构体,其中 Student 结构体嵌入了 Person 结构体。这样我们就可以直接访问 Student 结构体中的 Person 结构体中的字段了。

示例三:作为方法参数

在某些情况下,我们可能需要将一个结构体作为参数传递给一个方法,但是这个结构体可能只会在这个方法中使用,不需要单独定义一个名称。这时候就可以使用匿名结构体了。示例代码如下:

func printPerson(p struct {
    Name string
    Age  int
}) {
    fmt.Println(p.Name, p.Age)
}

func main() {
    p := struct {
        Name string
        Age  int
    }{
        Name: "John",
        Age:  20,
    }
    printPerson(p)
}

这里我们定义了一个 printPerson 方法,其中参数 p 就是一个匿名结构体。在 main 函数中,我们创建了一个匿名结构体并将其传递给 printPerson 方法。

总结

本文详细介绍了 Go 语言中的匿名结构体,包括其定义、特点、用法等方面,并且提供了一些示例代码来帮助读者更好地理解。匿名结构体是一种非常有用的编程技巧,可以帮助我们实现代码复用、结构清晰等目标,值得我们在实际开发中加以应用。

GO语言基础教程(106)Go结构体之匿名成员和匿名结构体:Go结构体秘闻:匿名成员与结构体的终极潜入 本文将深入探讨Go语言中结构体的匿名成员与匿名结构体,通过生动示例揭示其神秘面纱。匿名成员是只有类型没有名字的结构体字段,而匿名结构体则是没有类型名的结构体。它们在Go编程中扮演着重要角色,能够简化代码、实现类似继承的效果。文章将详细解析其使用场景、注意事项,并通过完整示例展示如何在实际项目中灵活运用这些特性。 阅读详情

相关推荐

GO语言基础教程(108)Go匿名成员和匿名结构体之匿名结构体:Go语言隐藏技能!匿名结构体让你代码骚到飞起,看完秒变老司机!

Go语言的匿名结构体就像编程界的“隐身侠”,无需提前定义类型就能随手组装数据容器,特别适合临时存数据或JSON解析。它直接集成字段、无需命名,写起来超省事,但要注意无法重复使用和添加方法的小缺陷。本文将用多个接地气的例子,带你玩转匿名结构体的声明、嵌套和实战技巧,轻松写出更灵活的Go代码!

jxf_jxfcsdn的博客 654

匿名结构体在Go语言中的应用

匿名结构体是Go语言中一个十分有用的特性,它可以快速地创建临时数据结构或者作为其他结构体的字段进行嵌套。本文介绍了匿名结构体的声明和初始化方式,并展示了相关应用场景的代码示例。希望读者能够在实际开发中充分利用匿名结构体的优势,提升代码的可读性和灵活性。本文将详细介绍匿名结构体在Go语言中的应用,并展示相关的代码示例。匿名结构体也可以作为其他结构体的字段,起到嵌套的作用。以上就是关于匿名结构体在Go语言中的应用的介绍。通过匿名结构体的嵌套,可以更方便地访问和操作相关的数据。匿名结构体在Go语言中的应用。

IELLQUI1的博客 373

Go 学习笔记(14)— 结构体定义、实例化、初始化、匿名结构体、结构体访问、结构体作为形参、结构体指针

1. 结构体定义 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下: type struct_variable_name struct { member definition; member defin...

wohu1104的专栏 4513

Golang匿名结构体的使用

一、结构体基础 结构体 (struct) 将多个不同类型的字段集中组成一种复合类型,按声明时的字段顺序初始化。 typeuserstruct{ namestring agebyte } user:=user{"Tom",2} 定义匿名结构体时没有type关键字,与其他定义类型的变量一样,如果在函数外部需在结构体变量前加上var关键字,在函数内部可省略v...

weixin_42117918的博客 1万+

goLang 匿名struct 的用法

go语言匿名struct的基本用例。

JineD的博客 636

2022(一等奖)B360基于Arcpy与SVM的滑坡易发性评价

此外,在ArcGIS平台下,“易发性图预测(多进程)”工具的运行时间为2h 48m 3s,“易发性图预测(单进程)”工具的运行时间为5h 19m 27s,运行时间缩短了近2h 31m 24s,运行效率提高了47.39%。在ArcGIS Pro平台下,“易发性图预测(多进程)”工具的运行时间为20m 12s,“易发性图预测(单进程)”工具的运行时间为1h 26m 47s,将运行时间缩短了近1h 6m 35s,运行效率提高了76.72%。滑坡的发生受各种影响因素的影响,目前,影响因素的选择没有一个统一的标准。

2301_77310370的博客 1467

Golang Go语言结构体中匿名字段暴露方法的优先级

Golang Go语言结构体中匿名字段暴露方法的优先级 Go语言的结构体中可以包含匿名的字段,比如: 1 2 3 4 5 6 7 struct {     T1        // 字段名自动为 T1     *T2       // 字段名自动为 T2     P.T3      // 字段名自动为 T3     *

typ2004的专栏 7065

BERTopic模型入门教程(附代码+参数调节)

BERTopic 是一种用于从文本数据中提取主题模型的新型方法。通过结合 BERT嵌入和传统的主题模型来生成语义丰富的主题。传统的主题模型(如LDA)主要依赖于词频矩阵,而 BERTopic 通过预训练语言模型生成高维语义嵌入来捕捉词语间的复杂关系,因此可以更好地处理上下文信息。BERTopic模型可以看作是创建其主题表示的一系列步骤。核心原理如下:就本质而言,BERTopic就是一个拼装框架,可以把每部分都替换成其他模型,只要完成任务即可。

m0_52069102的博客 1万+

go语言基础 匿名结构体

结构体和函数一样,也可以使用匿名结构体 ,使用匿名结构体也要直接赋值给变量,不要没法使用        匿名结构体和匿名字段 没有名字的结构体: a := struct {字段的定义}{赋值} func (){} ()        type A struct{ string int } b := A{"字符串", 20} b.string,b.int //匿名字段可以理解为字段名和字段类型一...

超级系博客 7647

Kettle Web版部署指南

看到以上的日志则表示启动成功。

2401_89221867的博客 1718

解决Word中英文混排的5个常见排版问题(含单词换行、间距调整等)

本文详细解析Word中英文混排的5大常见排版问题,包括单词换行、间距调整、标点混用等,提供专业解决方案。通过设置段落格式、调整兼容性选项和使用字体组合等技巧,帮助用户轻松解决文档排版难题,提升专业性和阅读体验。

vim8coder的博客 1338

go语言匿名结构体组合技巧

4. **匿名结构体作为函数参数或返回值**:可以将匿名结构体作为函数的参数或返回值,但要注意接收方需要知道如何正确处理这个匿名结构体。7. **可读性**:虽然匿名结构体可以减少代码量,但如果过度使用,可能会降低代码的可读性。2. **访问字段**:由于匿名结构体嵌入了其他结构体,所以可以直接通过匿名结构体访问嵌入结构体的字段。9. **接口实现**:匿名结构体可以隐式地实现嵌入结构体的接口,只要嵌入的结构体实现了该接口。1. **定义匿名结构体**:在需要的地方定义匿名结构体,并嵌入其他结构体。

leijmdas的专栏 631

103.在 Vue 3 中使用 OpenLayers 控制图层来显示/隐藏地图

是一个强大的开源库,可以用于构建各种地理信息系统应用。在 Vue 3 中,我们可以结合。方法,可以直接控制某个图层是否可见,而不需要删除或重新创建图层。在开始之前,确保你已经搭建了 Vue 3 项目,并安装了。本文将详细介绍如何在 Vue 3 组合式 API (,并实现按钮控制地图的显示/隐藏功能。会导致 OSM 瓦片地图无法加载。方法控制地图图层的显示与隐藏。安装完成后,即可开始编写代码。在本教程中,我们介绍了如何在。来实现地图的显示/隐藏功能。来实现交互式地图,并通过。在 WebGIS 开发中,

小彭的博客 1561

go语言之进阶篇非结构体匿名字段

1、非结构体匿名字段 示例 : package main import "fmt" type mystr string //自定义类型,给一个类型改名 type Person struct { name string //名字 sex byte //性别, 字符类型 age int //年龄 } type Student struct {...

weixin_30632089的博客 320

【人工智能之深度学习】21. 自动驾驶感知实战:YOLOv4复杂天气优化方案(BDD100K全代码+效果对比)

摘要:自动驾驶摄像头在雨雾天气下易受图像模糊、目标遮挡影响,导致YOLOv4检测精度骤降。本文基于BDD100K公开数据集(含多天气场景),设计三阶段优化方案:1)物理建模生成雨雾效果(雨滴线条+大气散射模型),将恶劣天气样本占比从20%提升至40%;2)在YOLOv4颈部嵌入CBAM注意力机制,强化模糊区域特征提取;3)L1剪枝(30%)+TensorRT量化实现轻量化。需特别说明:本文为教学虚拟案例,不可直接用于车载部署,实际落地需结合多传感器融合与ISO 26262认证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1685

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。

Heartsuit的博客 2462

Go语言Interface作为struct field,谈谈结构体中的匿名接口

Go语言中通过组合(composite)实现类似继承(extends)和重写(override)的功能,大家可能平时用的比较多的是struct中匿名struct的写法,有没有见过struct中匿名接口(anonymous interface)的写法呢? Interface这个接口直接作为struct中的一个匿名字段,在标准库sort包中就有这种写法: type Interface interfac...

Salted fish in hand, I have the world. 1386

APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)

做过APP逆向和爬虫的同学,肯定都被签名验证折磨过:改了一行代码重新打包,APP直接闪退;抓包看到接口有个sign参数,翻遍JS找不到加密逻辑;好不容易找到加密函数,一调用就崩溃。客户端APK签名校验服务端接口签名验证。前者防止你篡改APP,后者防止你伪造请求。很多人卡在第一步,改完APK就闪退,根本没机会碰接口。本文基于真实项目实战,分享一套通用的签名验证破解方案。从客户端APK签名校验的Frida Hook绕过,到服务端sign算法的逆向还原,最后用Python实现一键调用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 964

go语言之多继承 匿名结构体与匿名结构体指针

go继承 其他结构体不需要重新定义这些属性和方法,只需要嵌套一个Student匿名结构体。 使用: 直接 放另一个结构体名 package main import "fmt" func main() { // 小学生 pupil := &pupil{} pupil.Student1.Name = "lwt小" pupil.Student1.Age = 11 pupil.exam() pupil.Student1.SetScore(99) pupil.Student1.ShowIn

程序彤的博客 654

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

go在方法中修改结构体的值_Golang的学习笔记(11)--Go结构体

Golang的学习笔记(11)--Go结构体目录Go结构体Go的结构体是一种复合类型,它由一系列属性(字段)组成,每个属性(字段)都有自己的类型和值。结构体的字段可以是任何类型,甚至是结构体本身、函数、接口等在Go中没有类的概念,因此结构体经常被用来替代面向对象中的类的操作Go结构体的定义结构体的定义格式如下:type structName struct {field1 type1field2 t...

weixin_39581995的博客 2718

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

go语言之结构体匿名字段

定义:结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段就称为匿名字段。 package main import "fmt" //匿名字段 type person struct { string int } func main() { p1 := person{ "dudu", 3, } fmt.Println(p1) fmt.Printf("%#v\n", p1) fmt.Println(p1.string, p1.int) } 注意:这里匿名字段的说

weixin_44961320的博客 521

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

GO语言基础教程(107)Go匿名成员和匿名结构体之匿名成员:Go语言隐藏技能:匿名成员让你代码“偷偷”变优雅!

Go语言的匿名成员就像编程界的“扫地僧”,看似普通却内力深厚。本文将深度剖析匿名成员与匿名结构体的使用姿势,从基础概念到实战应用,带你解锁代码复用的新境界。通过完整示例揭秘如何用匿名成员实现类似继承的效果,让你的Go代码既简洁又强大,彻底告别重复代码的噩梦!

jxf_jxfcsdn的博客 434

Go语言-【结构体】-使用匿名结构体解析JSON数据

JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。在类似的协议中,JSON 并不是唯一的一个标准协议。 XML、ASN.1 和 Google 的 Protocol Buffers 都是类似的协议,并且有各自的特色,但是由于简洁性、可读性和流行程度等原因,JSON 是应用最广泛的一个。 Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的 encoding/json、encoding/xml、encoding/asn1 等包提供支持,并且这类包都有着相似的 ...

xyz的专栏 445

Go语言:结构体匿名组合编译报错“ambiguous selector”

Go没有类似Java那样的继承,只能通过结构体的匿名组合来实现继承的特性。这个过程是在编译过程完成的,例如下例,假如没有T2的话,那么编译器会给MyStruct创建一个m1方法,然后在方法里调用T1.m1()。 func (m *MyStruct) m1(){ m.T1.m1() } 但是如果MyStruct又匿名组合了T2,而T2也有m1()方法,则编译器就不知道在给MyStruct创建m1方法时应该选择T1还是T2的m1(),于是就报错“ambiguous selector”。除了方法..

pengpengzhou的博客 1786

go语言通过结构体匿名字段实现方法的继承和覆盖

golang结构体匿名字段实现方法的继承和覆盖

qq_29295329的博客 1138
上一篇: Go语言结构体
下一篇: Go语言解析Json
GeeCode
博客等级 码龄3年 2粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值