【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

在这里插入图片描述

嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌套、方法以及与面向对象编程的关系,带你逐步领略结构体的魅力。

结构体:理解自定义类型

在Go语言中,结构体是一种自定义的数据类型,它允许我们将不同类型的数据字段(属性)组合在一起,形成一个自洽的数据结构。想象一下,你正在构建一个人的模型,你可以用结构体来描述一个人的姓名、年龄和地址等信息,让数据更有意义和结构。

定义结构体

在Go语言中,我们使用type关键字来定义一个新的自定义类型,其中结构体就是其中之一。一个结构体定义由字段组成,每个字段都有一个类型和一个字段名。

package mainimport "fmt"// 定义一个名为Person的结构体
type Person struct {FirstName stringLastName  stringAge       int
}func main() {// 使用结构体创建一个Person对象p := Person{FirstName: "Alice",LastName:  "Smith",Age:       30,}fmt.Println(p.FirstName, p.LastName)
}

结构体的初始化

结构体可以使用两种方式进行初始化:基于字段的初始化和值的列表初始化。

package mainimport "fmt"type Point struct {X intY int
}func main() {// 基于字段的初始化p1 := Point{X: 1, Y: 2}// 值的列表初始化p2 := Point{3, 4}fmt.Println(p1, p2)
}

嵌套结构体

在结构体中,字段的类型可以是任意类型,包括其他结构体。这种嵌套结构体的方式可以构建更复杂的数据结构。

package mainimport "fmt"type Address struct {City  stringState string
}type Person struct {FirstName stringLastName  stringAge       intAddress   Address // 嵌套Address结构体
}func main() {p := Person{FirstName: "Alice",LastName:  "Smith",Age:       30,Address: Address{City:  "New York",State: "NY",},}fmt.Println(p.FirstName, p.Address.City)
}

结构体方法

在Go语言中,我们可以为结构体定义方法,让结构体具有行为。方法是一种特殊类型的函数,它可以操作结构体的数据,从而实现更强大的功能。

package mainimport "fmt"type Circle struct {Radius float64
}func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}func main() {c := Circle{Radius: 5}fmt.Println("Circle area:", c.Area())
}

与面向对象编程的关系

结构体和面向对象编程的思想有着紧密的联系。通过结构体和方法,我们可以在Go语言中实现面向对象的特性,尽管Go相对于其他语言来说更加简洁。通过组合、封装和方法,我们可以构建出更有组织、可维护和可扩展的程序。

与其他语言的对比

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

注意事项

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

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

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

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

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

总结

结构体是Go语言中的一个强大工具,能够帮助我们定义自定义类型,并以更有结构的方式存储和操作数据。通过结构体的嵌套、方法和与面向对象编程的结合,我们可以构建出更加灵活和强大的应用程序。无论是创建简单的数据模型还是构建复杂的数据结构,结构体都是不可或缺的。

在你的学习过程中,记住以下几点:

  • 自定义类型:结构体允许你创建自己的数据类型,将不同的数据字段组合在一起。
  • 初始化:你可以通过字段名的初始化或者值的列表初始化来创建结构体对象。
  • 嵌套结构体:结构体可以嵌套其他结构体,形成更复杂的数据结构。
  • 方法:结构体可以拥有方法,让结构体具有更强大的行为。
  • 面向对象编程:Go语言中的结构体和方法使得面向对象编程的思想能够在代码中得以体现。

掌握结构体的概念和用法,将带给你更多的可能性和灵感,让你在编写Go程序时更加得心应手。无论是构建小型应用还是大型系统,结构体都是你编程旅程中的得力伙伴!

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

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

相关文章

03_html表单的使用

一、HTML表单的使用 1、 form标签 定义和用法: form: 标签用于为用户输入创建 HTML 表单,表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等 参数: action: 定义表单数据提交地址(不写默认本地地址)method: 表单提交的方…

设计模式行为型-模板模式

文章目录 一:模板方法设计模式概述1.1 简介1.2 定义和目的1.3 关键特点1.4 适用场景 二:模板方法设计模式基本原理2.1 抽象类2.1.1 定义和作用2.1.2 模板方法2.1.3 具体方法 2.2 具体类2.2.1 定义和作用2.2.2 实现抽象类中的抽象方法2.2.3 覆盖钩子方法 …

爬虫--爬取自己想去的目的的车票信息

前言: 本篇文章主要作为一个爬虫项目的小练习,来给大家进行一下爬虫的大致分析过程以及来帮助大家在以后的爬虫编写中有一个更加清晰的认识。 一:环境配置 Python版本:3.7 IDE:PyCharm 所需库:requests&#xff0…

js 正则表达式 验证 ip列表--详情:页面中一个输入框,可输入1个或多个IP,使用英文逗号隔开...

var isIp function (){ var regexp /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; return function (value){ var valid regexp.test(value); if (!valid){ //首先必须是 xxx.xxx.xxx.xxx 类型的数字,如果不是,返回false return false ; } return va…

Mysql数据库事务隔离级别造成死锁

场景:如下代码,获取数据库连接,删除权限的时候,会造成数据库死锁. 代码 日志: 数据库: SHOW OPEN TABLES where In_use > 0; 问题分析:测试环境Centos7操作系统,Mysql5.7.40版本程序运行正常,开发环境Windows操…

航天智信:严控航天系统研发安全,助力建设“航天强国”

航天智信作为中国航天科工三院在信息装备领域“做大做强”的重要布局,主要从事系统运用与联合体系研究,复杂信息系统的顶层设计、总体论证及研制生产,提供体系级、系统级信息系统整体解决方案,以及信息安全系统的设计研发与集成验…

O2OA(翱途)开发平台 V8.1正式发布

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们,平台 V8.1版本已正式发布。正值8月的最后一周,我们以更安全、更高效、更好用的崭新面貌迎接9月的到来。 O2OA开发平台v8.1版本更注重于对系统级别的安全防护。其中重大的更新,是对…

基于python的二维码识别系统设计与实现

摘要 现代社会中,人们对于计算机的应用十分的广泛,在计算机的应用开发上,现在有着非常丰富的开发内容供人们所使用,可以是在工作上、在生活方面、在娱乐方面等,通过电子化的产品能够更好的服务于人。而在计算机与实体…

ChatGPT如何应对紧急救援和医疗应急?

ChatGPT在紧急救援和医疗应急方面具有潜在的重要用途。它可以用于提供信息、建议和支持,以帮助应对各种突发事件,如自然灾害、流行病爆发、事故等。以下是ChatGPT如何应对紧急救援和医疗应急的方式以及相关挑战的详细讨论。 ### 紧急救援 #### 1. 提供…

ELK安装、部署、调试(四)KAFKA消息队列的安装和部署

1.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通…

Nginx 部署 配置

一.概述 什么是nginx? Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 什么是反向代理? 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求…

【C++学习】函数指针

#include<iostream> //包含头文件 using namespace std; void func(int no, string str){cout << "亲爱的"<< no << "号:" << str << endl; }int main(){int bh 3;string message "我是一只傻傻鸟";func…

LeetCode 面试题 02.03. 删除中间节点

文章目录 一、题目二、C# 题解 一、题目 若链表中的某个节点&#xff0c;既不是链表头节点&#xff0c;也不是链表尾节点&#xff0c;则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点&#xff0c;请实现一种算法&#xff0c;将该节点从链表中删除。 例如&#x…

【代码随想录day23】不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示…

Mysql高级语句

高级语句 1.按关键字排序 SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC ASC 是按照升序进行排序的&#xff0c;是默认的排序方式&#xff0c;即 ASC 可以省略。 SELECT 语句中如果没有指定具体的排序方式&#xff0c;则默认按 ASC…

力扣:78. 子集(Python3)

题目&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力…

实现Android分布式协同办公:将待办事件App与本地Web服务结合

AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…

AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样设置 …

Kohi 学习笔记

教程 Kohi Game Engine clang 报错 LINK : fatal error LNK1104: 无法打开文件“…\bin\engine.dll” clang %cFilenames% %compilerFlags% -o ../bin/%assembly%.dll %defines% %includeFlags% %linkerFlags%原因是不存在这个 bin 文件夹&#xff0c;需要自己创建 内存分配…

How to install mysql 5.7 64 bit with windows installer In Windows 10

How to install mysql 5.7 64 bit with windows installer In Windows 10 Search Search Search key word with mysql 5.7 windows installer 64 bit https://dev.mysql.com/downloads/windows/installer/5.7.html