【Go 基础篇】Go语言结构体基本使用

在这里插入图片描述

在Go语言中,结构体是一种重要的数据类型,用于定义和组织一组不同类型的数据字段。结构体允许开发者创建自定义的复合数据类型,类似于其他编程语言中的类。本文将深入探讨Go语言中结构体的定义、初始化、嵌套、方法以及与其他语言的对比,以便全面了解如何在Go中使用结构体。

结构体的定义与基本使用

结构体是一种用户定义的数据类型,由一组字段组成。每个字段都有一个名称和一个关联的数据类型。以下是一个简单的结构体定义的示例:

type Person struct {FirstName stringLastName  stringAge       int
}

在上述代码中,我们定义了一个名为Person的结构体,它具有FirstNameLastNameAge三个字段,分别表示人的名字、姓氏和年龄。

要创建结构体实例,可以使用结构体字面值的方式:

p := Person{FirstName: "John",LastName:  "Doe",Age:       30,
}

通过点号操作符可以访问结构体实例中的字段:

fmt.Println(p.FirstName) // 输出: John

结构体的初始化

结构体的初始化有多种方式,可以根据需求进行选择。除了上述的结构体字面值初始化,还可以使用零值初始化、部分字段初始化等。

  1. 零值初始化: 结构体的零值初始化会将所有字段初始化为它们各自类型的零值。
var emptyPerson Person
fmt.Println(emptyPerson.FirstName) // 输出: ""
  1. 部分字段初始化: 初始化结构体时,可以仅对感兴趣的字段进行赋值,未赋值的字段将使用零值。
partialPerson := Person{LastName: "Smith",
}
fmt.Println(partialPerson.Age) // 输出: 0

嵌套结构体

在Go语言中,结构体可以嵌套在另一个结构体中,从而创建更复杂的数据模型。这种嵌套的结构体可以使用点号操作符进行访问。

type Address struct {Street  stringCity    stringCountry string
}type Contact struct {Email    stringPhone    stringLocation Address
}

在上述代码中,我们定义了一个Contact结构体,它嵌套了Address结构体。要访问嵌套结构体的字段,可以使用多层点号操作符:

contact := Contact{Email: "john@example.com",Location: Address{City: "New York",},
}
fmt.Println(contact.Location.City) // 输出: New York

结构体方法

与其他面向对象语言类似,Go语言中的结构体可以拥有方法。方法是绑定到特定类型的函数,通过接收者(receiver)来关联方法与类型。以下是一个结构体方法的示例:

type Circle struct {Radius float64
}func (c Circle) Area() float64 {return math.Pi * c.Radius * c.Radius
}

在上述代码中,我们为Circle结构体定义了一个方法Area,用于计算圆的面积。注意,接收者使用值传递而不是指针传递,意味着在方法内部修改接收者字段不会影响原始结构体。

与其他语言的对比

与一些传统的面向对象语言相比,Go语言在结构体和类的定义上有一些区别。Go语言没有类的概念,而是通过结构体和方法来实现类似的功能。此外,Go语言的方法接收者可以是指针类型或值类型,这使得在方法内部是否能修改结构体字段有所不同。

注意事项

在使用结构体时,有一些注意事项需要牢记:

  1. 内存布局: 结构体的字段在内存中按照定义的顺序依次排列。这可以影响内存对齐和性能,特别是在涉及大量结构体实例的情况下。

  2. 嵌套结构体的可见性: 嵌套结构体的字段在外部结构体外部是不可见的,无法直接访问。需要通过外部结构体的实例进行访问。

  3. 字段命名冲突: 如果两个嵌套结构体拥有同名字段,访问时需要指定完整的嵌套路径。

  4. 方法接收者选择: 在设计方法时,需要根据是否需要修改接收者的字段来选择值类型还是指针类型的接收者。

总结

结构体是Go语言中强大且灵活的数据类型,用于定义和组织不同类型的数据字段。通过结构体,我们可以构建复杂的数据模型,并且可以为结构体定义方法来赋予其行为。嵌套结构体和接口的使用进一步增强了结构体的能力。尽管与传统OOP语言有所不同,Go语言中的结构体仍然提供了一种清晰而有效的方式来进行面向对象编程。通过充分理解和应用结构体,开发者可以更好地组织和管理代码,提高代码的可读性和可维护性。然而,在使用结构体时,也需要注意一些与内存布局、嵌套结构体等相关的注意事项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统学习Linux-ELK日志收集系统

ELK日志收集系统集群实验 实验环境 角色主机名IP接口httpd192.168.31.50ens33node1192.168.31.51ens33noed2192.168.31.53ens33 环境配置 设置各个主机的ip地址为拓扑中的静态ip,并修改主机名 #httpd [rootlocalhost ~]# hostnamectl set-hostname httpd [root…

Jupyter installation Tutorial

文章目录 1. 面向的系统2. 什么是Jupyter?3. 安装Python环境4. 安装Jupyter notebook5. Jupyter的启动和配置6. Jupyter的使用技巧7. conclusion参考文献 1. 面向的系统 Windows安装 2. 什么是Jupyter? Jupyter Notebook是一个开源的Web应用程序&…

Qt6.5安装教程——国内源

为什么离线包没了? Qt6开始非商业授权下,不再提供离线安装方式的exe,但源码安装费时费力,所以推荐安装方式已经为在线组件安装方式,包括vs2022、Qt在线安装工具已经成为开发工具新的安装趋势。 Qt是不是要放弃开源&…

【LeetCode: 56. 合并区间+贪心+双指针+标识+模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

C#,《小白学程序》第六课:队列(Queue)的应用,《实时叫号系统》

医院里面常见的叫号系统怎么实现的&#xff1f; 1 文本格式 /// <summary> /// 下面定义一个新的队列&#xff0c;用于演示《实时叫号系统》 /// </summary> Queue<Classmate> q2 new Queue<Classmate>(); /// <summary> /// 《小白学程序》第…

CentOS 8 安装 Code Igniter 4

在安装好LNMP运行环境基础上&#xff0c;将codeigniter4文件夹移动到/var/nginx/html根目录下&#xff0c;浏览器地址栏输入IP/codeigniter/pulbic 一直提示&#xff1a; Cache unable to write to "/var/nginx/html/codeigniter/writable/cache/". 找了好久&…

图像颜色空间转换

目录 1.图像颜色空间介绍 RGB 颜色空间 2.HSV 颜色空间 3.RGBA 颜色空间 2.图像数据类型间的互相转换convertTo() 3.不同颜色空间互相转换cvtColor() 4.Android JNI demo 1.图像颜色空间介绍 RGB 颜色空间 RGB 颜色空间是最常见的颜色表示方式之一&#xff0c;其中 R、…

SQL注入之报错注入

文章目录 报错注入是什么&#xff1f;报错注入获取cms账号密码成功登录 报错注入是什么&#xff1f; 在注入点的判断过程中&#xff0c;发现数据库中SQL 语句的报错信息&#xff0c;会显示在页面中&#xff0c;因此可以利用报错信息进行注入。 报错注入的原理&#xff0c;就是在…

jwt安全问题

文章目录 jwt安全问题jwt简介jwt组成headerpayloadsignature 潜在漏洞空加密算法web346 密钥爆破web348 敏感信息泄露web349 **修改算法RS256为HS256**web350 jwt安全问题 jwt简介 JWT的全称是Json Web Token&#xff0c;遵循JSON格式&#xff0c;跨域认证解决方案&#xff0…

Vue.js2+Cesium1.103.0 十、加载 Three.js

Vue.js2Cesium1.103.0 十、加载 Three.js Demo ThreeModel.vue <template><divid"three_container"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint…

unity VS无法进行断点调试

有时候我们的VS无法进行断点调试&#xff0c;报错如下&#xff1a; 原因是&#xff1a;开启了多个项目&#xff0c;vs无法找到调式项目 解决&#xff1a;点击菜单栏--调试----附加unity调试程序 会弹出一个框&#xff0c;然后选择你要调试的项目 即可

Android屏幕显示 android:screenOrientation configChanges 处理配置变更 代码中动态切换横竖屏

显示相关 屏幕朝向 https://developer.android.com/reference/android/content/res/Configuration.html#orientation 具体区别如下&#xff1a; activity.getResources().getConfiguration().orientation获取的是当前设备的实际屏幕方向值&#xff0c;可以动态地根据设备的旋…

vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图

效果图&#xff1a; vis组件库&#xff1a;vis.js vis-network中文文档&#xff1a;vis-network 安装组件库&#xff1a; npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件&#xff1a; <template><…

写用例写的焦头烂额?看看摸鱼5年的老点工是怎么写的...

给你个需求&#xff0c;你要怎么转变成最终的用例&#xff1f; 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作&#xff1a; 第一步&#xff1a;解析需求 先解析需求-找出所有需求中的动词&#xff0c;再列出所有测试点。测试点过程不断发散&#xff0c;对于…

【Linux】centos8安装cmake3.27.4

第一步&#xff0c;去官网下安装包&#xff0c;一定不要下错了 下好了之后&#xff0c;用ftp软件传到云服务器或者虚拟机上&#xff0c;我用的是centos8系统&#xff0c;安装之前先准备好这些依赖项 yum install -y gcc gcc-c make automake yum install -y openssl openssl-…

视频云存储/安防监控视频智能分析网关V3:明烟/明火检测功能详解

智能分析网关系列是基于边缘AI计算技术&#xff0c;可对前端摄像头采集的视频流进行实时检测分析&#xff0c;能对监控画面中的人、车、物进行识别。我们的AI边缘计算网关硬件——智能分析网关目前有5个版本&#xff1a;V1、V2、V3、V4、V5&#xff0c;每个版本都能实现对监控视…

计算机毕设之Python的高校成绩分析(含文档+源码+部署)

本系统阐述的是一个高校成绩分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…

线上祭奠软件:虚拟纪念与情感表达的新方式

线上祭奠软件作为一种新兴的技术应用&#xff0c;正在改变传统祭奠方式&#xff0c;为人们提供了跨越时空的虚拟纪念和情感表达方式。本文将深入探讨线上祭奠软件的意义、功能与挑战&#xff0c;并思考其对社会和个人的影响。 一、线上祭奠软件的意义&#xff1a; 1.跨…

前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

LeetCode面试经典150题(day 1)

LeetCode是一个免费刷题的一个网站&#xff0c;想要通过笔试的小伙伴可以每天坚持刷两道算法题。 接下来&#xff0c;每天我将更新LeetCode面试经典150题的其中两道算法题&#xff0c;一边巩固自己&#xff0c;一遍希望能帮助到有需要的小伙伴。 88.合并两个有序数组 给你两个…