【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.rhkb.cn/news/118739.html

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

相关文章

小赢科技,寻找金融科技核心价

如果说金融是经济的晴雨表,是通过改善供给质量以提高经济质量的切入口,那么金融科技公司,就是这一切行动的推手。上半年,社会经济活跃程度提高背后,金融科技公司既是奉献者,也是受益者。 8月29日&#xff0…

postgresql并行查询(高级特性)

######################## 并行查询 postgresql和Oracle一样支持并行查询的,比如select、update、delete大事无开启并行功能后,能够利用多核cpu,从而充分发挥硬件性能,提升大事物的处理效率。 pg在9.6的版本之前是不支持的并行查询的,从9.6开始支持并行查询,但是功能非常…

go学习part21(3)redis连接池

连接池 1.介绍 每次使用数据就就建立链接再关闭可以,但是如果有大量客户端频繁请求连接,大量创建连接和关闭会非常耗费资源。 所以就建立一个连接池,里面存放几个不关闭的连接,谁要用就分配给谁。 说明:通过Golang 对 Redis操…

WebGPT VS WebGPU

推荐:使用 NSDT编辑器 快速搭建3D应用场景 随着WebGPU的引入,Web开发发生了有趣的转变,WebGPU是一种新的API,允许Web应用程序直接访问设备的图形处理单元(GPU)。这种发展意义重大,因为 GPU 擅长…

sublime编辑latex 出现参考文献无法编译报错:citation “...” undefined

问题描述 使用sublime编译latex文件时,参考文献按照常规的方式放好,ctrl B 编译的时候,显示找不到参考文献,编译出的pdf文件也没有references: 但是把文件放到overleaf上就可以直接编译出来,说明是本地编…

快速为RPG辅助工具MTool增加更多快捷键(一键保存等)

起源:MTool是个好工具,本身固然好用,但是它本身的快捷键功能很少,虽然内置了一个录制工具,但是一个个的录,又麻烦,一般人也难以掌握 本文用快速方法增加更多快捷键,可以做到一键保存…

c++ qt--线程(一)(第八部分)

c qt–线程(一)(第八部分) 一.进程(Process) 在任务管理器中的进程页下,可以看到进程,任务管理器将进程分为了三类,应用、后台进程、window进程 应用: 打开…

【UE 材质】实现方形渐变、中心渐变材质

步骤 一、实现方形渐变 1. 新建一个材质,材质域选择“后期处理” 2. 通过“Mask”节点单独获取R、G通道,可以看到R通道是从左到右0~1之间的变化,对应U平铺 可以看到G通道是从上到下0~1之间的变化,对应V平铺 3. 完善如下节点 二、…

Leetcode1090. 受标签影响的最大值

思路:根据值从大到小排序,然后在加的时候判断是否达到标签上限即可,一开始想用字典做,但是题目说是集合却连续出现两个8,因此使用元组SortedList进行解决 class Solution:def largestValsFromLabels(self, values: li…

Java后端开发面试题——多线程

创建线程的方式有哪些? 继承Thread类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("MyThread...run...");}public static void main(String[] args) {// 创建MyThread对象MyThread t1 new MyThread() ;MyTh…

aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl 需要先用aarch64工具链编译zlib和openssl aarch64-linux环境搭建 下载工具链 gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnusysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-lin…

iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍

在移动应用开发中,进程间通信(Inter-Process Communication,IPC)是一项至关重要的技术,用于不同应用之间的协作和数据共享。在iOS生态系统中,进程和线程是基本的概念,而进程间通信方案则为应用的…

在 Spring Boot 中集成 MinIO 对象存储

MinIO 是一个开源的对象存储服务器,专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO,以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…

Linux:内核解压缩过程简析

文章目录 1. 前言2. 背景3. zImage 的构建过程4. 内核引导过程5. 内核解压缩过程6. 内核加压缩过程小结7. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 本文基于 ARM32架构 …

剑指 Offer 62. 圆圈中最后剩下的数字(简单)

题目&#xff1a; class Solution { public:int lastRemaining(int n, int m) {int pos 0;for(int i2;i<n;i){pos (posm)%i;}return pos;} };作者&#xff1a;想吃火锅的木易 链接&#xff1a;详细题解 来源&#xff1a;力扣&#xff08;LeetCode&#xff09;

【微服务部署】07-调用链追踪

文章目录 集成SkyWalking实现调用链追踪1. SkyWalking架构图2. 代码集成SkyWalking 集成SkyWalking实现调用链追踪 1. SkyWalking架构图 Receiver是SkyWalking的入口&#xff0c;支持gRPC和HTTP协议。 SkyWalking内部有分析和查询两个部分 存储方面SkyWalking支持Elasticsearc…

第一个实例:QT实现汽车电子仪表盘

1.实现效果 1.1.视频演示 QT 实现汽车仪表盘 1.2.实现效果截图 2.生成的安装程序 此程序是个windows下的安装程序,可以直接安装,看到汽车仪表盘的实现效果,安装程序从下面链接下载: 【免费】使用QT实现的汽车电子仪表盘,在windows下的安装程序资源-CSDN文库 3.功能概述…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式&#xff08;Memento Pattern&#xff09;含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念&#xff1a;规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件&#xff1b;线性规划即以线性函数为目标函数&a…

密码算法、密钥体系---安全行业基础篇1

一、密码算法 密码算法是一种数学和计算方法&#xff0c;用于保护数据的机密性和安全性。不同的密码算法使用不同的数学原理和技术来加密和解密数据。以下是一些常见的密码算法类型&#xff1a; 1. **对称密码算法&#xff1a;** 特点&#xff1a;相同的密钥用于加密和解密数…