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

news2025/1/21 15:35:08

在这里插入图片描述

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

结构体的定义与基本使用

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

type Person struct {
    FirstName string
    LastName  string
    Age       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  string
    City    string
    Country string
}

type Contact struct {
    Email    string
    Phone    string
    Location 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.coloradmin.cn/o/950822.html

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

相关文章

Java八股文学习笔记day01

01.和equals区别 对于字符串变量来说,使用""和"equals"比较字符串时,其比较方法不同。""比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。 对于非…

VR司法法治教育平台,沉浸式课堂教学培养刑侦思维和能力

VR司法法治教育平台提供了多种沉浸式体验,通过虚拟现实(Virtual Reality,简称VR)技术让用户深度参与和体验法治知识。以下是一些常见的沉浸式体验: 1.罪案重现 VR司法法治教育平台可以通过重现真实案例的方式,让用户亲眼目睹罪案发…

基于天鹰算法优化的BP神经网络(预测应用) - 附代码

基于天鹰算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于天鹰算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.天鹰优化BP神经网络2.1 BP神经网络参数设置2.2 天鹰算法应用 4.测试结果:5.Matlab代码 摘要…

Python 的画图函数 seaborn 简介

seaborn 简介 seanborn 是 Python 的另外一个常用工具包,它基于 matplotlib,但画出的图形更加美观些,并且与 Pandas 的数据类型结合地较好。 # Import seaborn import seaborn as sns import matplotlib.pyplot as plt# Apply the default …

选择一款可靠的仓库管理软件

在选择仓库管理软件时,数据的准确性、数据的安全性和软件的稳定性这三点是至关重要的。下面我们将详细讨论这些关键点。 第一,数据的准确性对于一个仓库管理软件来说是非常重要的。如果数据的准确性无法得到保证,那么这样的仓库入库出库管理…

华为OD七日集训第1期复盘 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、活动内容如下第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、双指针第5天、递归回溯第6天、二分查找第7天、贪心算法 && 二叉树 二、可观测性工程1、简介2、主要内容 大家好,我是哪吒。 最近一直在刷华为OD机试的算法题,坚持…

RT-Thread内核机制 线程栈

int flag;void cmp_val(int a,int b) {volatile int tmp[10];tmp[0] a;if(tmp[0] > b){flag 1;}else{flag 0;} }int main() {int a 1;int b ;cmp_val(a,b);return 0; }我们写好的程序会保存在Flash上。 其它类似汇编指令 SUB R0,R0,#4 R0 R0-4 B LR 放入LR寄存器 局…

Swift使用PythonKit调用Python

打开Xcode项目。然后选择“File→Add Packages”,然后输入软件包依赖链接: ​https://github.com/pvieito/PythonKit.git https://github.com/kewlbear/Python-iOS.git Python-iOS包允许在iOS应用程序中使用python模块。 用法: import Pyth…

超大屏画质奇迹 !TCL 115吋 QD-Mini LED 电视成豪宅顶配

有目共睹的是,现如今的电视屏幕越做越大。 尤其近年来,大屏电视的趋势愈发明显,原因无他,大屏电视所带来的震撼视觉体验,是其他电视所无法比拟的,这也正是电视品牌们不断突破新局限,往“大”了…

Python 画多个子图函数 subplot

子图函数 subplot 若要 pyplot 一次生成多个图形,一般要用到subplot函数,另外还有一个subplots函数。两个函数比较接近但略有区别,限于篇幅,我们只介绍 subplot函数,它的基本语法如下: ax plt.subplot(n…

【C语言基础】变量类型,Static关键字的使用

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

【C/C++】#define宏替换高级用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

载舟前行——2023跳槽涨薪,Android的1000道面试题

转眼没有口罩的一年&#xff0c;就来到下半年。比起之前几年今天愈发的艰难&#xff1b;今年的金九银十的来到&#xff0c;许多跳槽找工作的也来到了旺季。岗位的减少无疑造成的后果就是竞争大&#xff0c;所以面试优胜劣汰你需要在千百人中脱颖而出。 面试不容小觑&#xff0…

英文晨读记录(broken heart)

2023/8/28 mate 配偶;伙伴;朋友;(男人之间常 用)哥儿们&#xff0c;伙计&#xff0c;老兄;同伴;subject n. 主题;问题;学科;课程;科目;话题;题目;题材;表现对象; adj. 服从于;取决于;视…而定;易遭受…的;受…支配;可能受…影响的;受异族统治的 vt. 使臣服;使顺从;(尤指)压服 …

Go 面向对象(匿名字段)

概述 严格意义上说&#xff0c;GO语言中没有类(class)的概念,但是我们可以将结构体比作为类&#xff0c;因为在结构体中可以添加属性&#xff08;成员&#xff09;&#xff0c;方法&#xff08;函数&#xff09;。 面向对象编程的好处比较多&#xff0c;我们先来说一下“继承…

软件系统测试报告包括哪些内容?对软件产品起到什么作用?

软件系统测试报告是软件开发过程中非常重要的一环。它是一个详细记录了对系统进行测试的结果和总结的文档。通过系统测试报告&#xff0c;开发人员可以了解系统在测试过程中的表现&#xff0c;发现系统的问题和不足之处&#xff0c;从而采取相应的措施进行改进。 一、软件系统…

睿趣科技:抖音开小店大概多久可以做起来

随着移动互联网的快速发展&#xff0c;社交媒体平台成为了人们分享生活、交流信息的主要渠道之一。在众多社交平台中&#xff0c;抖音以其独特的短视频形式和强大的用户粘性受到了广泛关注。近年来&#xff0c;越来越多的人通过在抖音上开设小店来实现创业梦想&#xff0c;这种…

CSPM考试如何报名?证书在哪查?

WOW&#xff01;咱们国家自己的项目管理证书来了&#xff01;&#xff01; 下面我将从7个方面对国标项目管理证书CSPM详细介绍&#xff1a; &#xff08;1&#xff09;CSPM是什么证书&#xff1f; &#xff08;2&#xff09;和PMP什么关系&#xff1f; &#xff08;3&#…

Windows系统下MMDeploy预编译包的使用

Windows系统下MMDeploy预编译包的使用 MMDeploy步入v1版本后安装/使用难度大幅下降&#xff0c;这里以部署MMDetection项目的Faster R-CNN模型为例&#xff0c;将PyTorch模型转换为ONNX进而转换为Engine模型&#xff0c;部署到TensorRT后端&#xff0c;实现高效推理&#xff0c…

SQL注入漏洞复现(CVE-2017-8917)

文章目录 搭建环境启动环境漏洞复现报错注入使用sqlmap 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub Docker Compose是 docker 提供的一个命令行工具&…