Go语言入门【09】结构体

2023-11-19

结构体

相比于Java,在Go语言中没有类的概念,但是多了结构体。结构体与Java中的类很像,是表示一系列同一类型或不同类型的数据构成的数据集合。

例如可以将学生抽象成一个结构体,每一个学生有以下属性:

Name:姓名

Age:年龄

Gender:性别

Grade:年级

那么以上的所有属性就组成了一个结构体,这个结构体可以命名为Student。

结构体定义

在使用结构体时首先需要对结构体进行定义,定义结构体需要使用到关键字typestruct,语法如下:

type 结构体名称 struct {
  成员名 成员类型
}

Student结构体代码示例:

// 定义一个Student结构体
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

如上所示,就定义了一个Student结构体,在这个结构体中有Name、Age等成员变量。

结构体声明

在声明结构体时可以直接指定结构体中成员变量的值。

代码示例:

package main

import "fmt"

func main() {
  // 1
  stu1 := Student{"张三", 18, "男", "大一"}
  // 2
  stu2 := Student{
    Name: "李四",
    Age: 20,
    Gender: "女",
    Grade: "大三",
  }
    // 3
  stu3 := Student{}
  fmt.Println(stu1)
  fmt.Println(stu2)
  fmt.Println(stu3)
}

// 定义结构体Student
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}
  1. 使用该方法声明结构体直接按照结构体中成员变量的顺序指定值即可,需要注意的是,这种方式给成员变量赋值需要全部赋值,不能只给其中部分赋值。
  2. 该方法使用键值对的形式给成员变量赋值,可以只给指定的成员变量赋值,其他没有赋值的则为默认值。
  3. 该方法只声明了一个结构体,没有给成员变量赋值,则结构体中所有变量均为默认值。

运行结果:

访问结构体成员

在上述的代码中,都是直接输出整个结构体,如果需要访问到结构体中的某一个成员变量,或者改变已经声明好的某个成员变量的值,就需要使用到.操作符。

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  // 打印结构体的值
  fmt.Println("学生姓名:", stu.Name)
  fmt.Println("学生年龄:", stu.Age)
  fmt.Println("学生性别:", stu.Gender)
  fmt.Println("学生年级:", stu.Grade)
  // 修改结构体中的值
  stu.Name = "李四"
  stu.Age = 19
  stu.Gender = "女"
  stu.Grade = "大二"
  // 打印修改后的结构体的值
  fmt.Println("-----------------")
  fmt.Println("学生姓名:", stu.Name)
  fmt.Println("学生年龄:", stu.Age)
  fmt.Println("学生性别:", stu.Gender)
  fmt.Println("学生年级:", stu.Grade)
}

// 定义结构体Student
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

运行结果:

如上所示,使用.操作符可以很方便的访问或者修改结构体中的某一个成员变量。

方法

在之前的文章中学习过go语言中的函数,其实在go语言中既有函数又有方法,方法就是规定了接受者的函数,接受者就是在函数名称前面多了一个参数,表示将该方法绑定到这个参数对应的类型上,绑定之后该方法就只能被这个参数对应的类型的变量才能够调用。

如果有以下方法,该方法就只能Student类型的变量才能够调用,调用方式为变量名.方法名

func (stu Student) print()  {
  // 方法体
}

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  stu.print()
}

type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

func (stu Student) print()  {
  fmt.Println("姓名", stu.Name)
  fmt.Println("年龄", stu.Age)
  fmt.Println("性别", stu.Gender)
  fmt.Println("年级", stu.Grade)
}

在上述代码中定义了一个print方法,该方法的接受者为Student类型,则该方法与Student类型绑定,也就只能Student类型的变量才能够调用,所以在main中使用stu.print()调用该方法不会有问题,但是在main中无法直接调用该方法,并且使用stu调用该方法时,在方法内部可以拿到stu的成员变量的值。

运行结果:

结构体指针

结构体作为一种类型,同样有其对应的指针类型,例如上述例子中的结构体Student,就有其对应的指针类型*Student,可声明一个指针用于存储结构体变量的地址。

var stuPointer *Student

然后将结构体类型变量的地址通过取地址符&取出赋值给指针stuPointer

stuPointer = &stu

在使用结构体指针时,同样可以使用.操作符访问结构体内部的成员变量。

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  // 定义结构体指针
  var stuPointer *Student
  // 将结构体地址赋值给指针
  stuPointer = &stu
  // 结构体指针通过点(.)操作符访问成员变量
  fmt.Println("姓名:", stuPointer.Name)
  fmt.Println("年龄:", stuPointer.Age)
  fmt.Println("性别:", stuPointer.Gender)
  fmt.Println("年级:", stuPointer.Grade)
}

type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

运行结果:

同样可以使用结构体指针加.操作符修改成员变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言入门【09】结构体 的相关文章

  • 【计算机毕业设计】SpringBoot+Vue.js协同过滤算法美食推荐小程序 _7tr93

    伴随着我国社会的发展 人民生活质量日益提高 于是对各种需求进行规范而严格是十分有必要的 所以许许多多的微信小程序应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套协同过滤算法美食推荐小程序 帮助美食推荐进行美食分类
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【gee】下载modis土地利用类型

    var china ee FeatureCollection projects assets china boundary var lc dataset ee ImageCollection MODIS 061 MCD12Q1 filter
  • qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

    系统环境 Win10家庭中文版 Qt 5 12 9 链接了一些64位的第三方库 程序编译完运行后出现 qt qpa plugin Could not find the Qt platform plugin windows in 弹窗如下 网
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • 计算机Java项目|基于SSM的微课学习系统

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 计算机Java项目|在线图书管理

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • APP开发毕业设计|ssm爱心小屋公益机构智慧管理APP

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 2024史上最全Java面试八股文(带全部答案)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 【固定翼飞行器】用于计算固定翼飞机空气动力学的紧凑涡旋格方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-查找接口成功率最优时间段-Python-OD统一考试(C卷)

    题目描述 服务之间交换的接口成功率作为服务调用关键质量特性 某个时间段内的接口失败率使用一个数组表示 数组中每个元素都是单位时间内失败率数值 数组中的数值为0 100的整数 给定一个数值 minAverageLost 表示某个时间段内平均失
  • 计算机Java项目|有机蔬菜商城

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个
  • 计算机Java项目|人体健康信息管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|java游戏账号交易系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板

随机推荐

  • SpringBoot整合JPA 数据库自动增加字段问题记录

    Spring整合JPA启动的时候忽然发现 数据增加了两个字段 我当时就很纳闷了 我自己写的有实体有字段 并且跟数据一致 为什么要给我增加两个字段哪 我的实体如下 启动的时候就变成这样了 然后就找度娘问原因 度娘告诉我JPA会把我们的驼峰命名
  • TensorFlowX.Y核心基础与AI模型设计01: TF模型从0到1搭建流程【加载数据、训练数据、保存模型、推理图像】

    上一篇文章 TensorFlowX Y核心基础与AI模型设计开篇 1 思想启蒙 mnist手写体从模型搭建到图片识别 通过手写字体认识模型的构建发整体流程 加载数据 构建模型 训练模型 保存模型 测试代码 import tensorflow
  • 力扣leecode-python解法笔记之202. 快乐数

    class Solution object def isHappy self n type n int rtype bool if n 1 return True def square each num 定义一个用于计算每一位数平方和的函数
  • Linux系统安装JDK1.8

    1 安装JDK 可以直接使用finallshell拖过去 统一放在linux中 usr soft目录下 1 解压该软件 tar zxvf jdk 8uXXXX tar gz 2 重命名解压后的目录 3 配置jdk的环境变量 再任何目录下都可
  • STM32学习笔记7——浮点数四舍五入

    C 中浮点转换为整型是截断的 直接将后面的小数去掉 而不是四舍五入 如 uint16 t 12 89 12 而不是13 项目中写了个小函数 将浮点数输入后 直接用7段译码管显示 用上述方法转换为整型后发现有显示误差 解决方法如下 1 定义一
  • 往Oracle数据库导入数据的两种方法

    在升级项目中 经常需要对数据进行迁移 我这次主要操作的是将数据从Access迁移到Oracle中 如何将数据导入Oracle数据库中 我总结了两种方法 供参考 1 SQL loader 1 1 主要特征 SQL loader是Oracle数
  • python图像分割模型_图像分割python

    常用的十大 python 图像处理工具 本文为 AI 研习社编译的技术博客 原标题 10 Python image manipulation tools 作者 Parul Pandey 翻译 安其罗 乔尔 JimmyHua 编辑 王立鱼 原
  • vue树形组件封装(移动端)

    最近在做移动端的项目 由于没有找见移动端树形组件 所以封装了一个 包含加载所有数据的功能以及懒加载功能 以下是目录结构 以下是完成后的ui 点击左侧切换 展开 收起 点击右侧其他操作 然后直接上代码 以下是懒加载的例子 一次性全部加载的就不
  • 一图看懂 pandas 模块(1):提供高性能、易用的数据结构和数据分析工具,资料整理+笔记(大全)

    本文由 大侠 AhcaoZhu 原创 转载请声明 链接 https blog csdn net Ahcao2008 一图看懂 pandas 模块 提供高性能 易用的数据结构和数据分析工具 资料整理 笔记 大全 摘要 模块图 类关系图 模块全
  • 【数据结构】单向链表的修改和删除

    单向链表的修改和删除 从单链表中删除一个节点思路 1 找到需要删除节点的前一个节点temp 2 temp next temp next next 3 被删除的节点 将不会有其他引用指向 会被垃圾处理机制回收 1 单向链表的修改操作 1 1
  • python轻量级web框架 flask

    文章目录 一 flask介绍 1 flask的构成 2 使用flask框架的原因 3 flask的优点 4 flask构成部分的介绍 5 flask特点 6 flask的基本模式 7 使用的flask版本 8 flask提供了什么 二 开始
  • 正方教务系统成绩爬虫的实现

    正方教务系统爬虫 简介 一 设计思路以及工具 二 实现步骤 1 登陆流程 1 1抓取登陆链接 1 2 验证码获取 1 3 发送登陆请求 2 读入数据 2 1 获取历年成绩对应的 VIEWSTATE 3 数据处理 3 1 存放数据 总结 简介
  • 子查询与JOIN&LEFT JOIN比较

    MySQL从4 1版本开始支持子查询 使用子查询进行SELECT语句嵌套查询 可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作 子查询虽然很灵活 但是执行效率并不高 原因 执行子查询时 MySQL需要创建临时表 查询完毕后再删除这些临
  • vue2的了解

    目录 前言 一 性能优化 二 vue 1 keep live 2 vuex 3 v once 4 mixin 5 v if和v show 6 防抖和节流 7 promise 8 freez冻结数据 9 http状态码 10 重绘和回流 11
  • (Java)leetcode-76 Minimum Window Substring(最小覆盖子串)

    题目描述 给你一个字符串 s 一个字符串 t 返回 s 中涵盖 t 所有字符的最小子串 如果 s 中不存在涵盖 t 所有字符的子串 则返回空字符串 注意 如果 s 中存在这样的子串 我们保证它是唯一的答案 示例 1 输入 s ADOBECO
  • .gitignore是干什么的?

    Git忽略文件 gitignore详解 在工程中 并不是所有文件都需要保存到版本库中的 例如 target 目录及目录下的文件就可以忽略 在Git工作区的根目录下创建一个特殊的 gitignore文件 然后把要忽略的文件名填进去 Git就会
  • Nacos启动异常与SpringBoot整合异常记录

    1 nacos启动异常 问题描述 Bean instantiation via factory method failed nested exception is org springframework beans BeanInstanti
  • 【Microsoft Azure 的1024种玩法】七十五.云端数据库迁移之快速将阿里云RDS SQL Server无缝迁移到Azure SQL Database中

    简介 本篇文章主要介绍了如何快速将阿里云RDS SQL Server无缝迁移到Azure SQL Database中 前期文章 Microsoft Azure 的1024种玩法 一 一分钟快速上手搭建宝塔管理面板 Microsoft Azu
  • 华为OD机试真题-修建高铁最低成本【2023Q1】

    题目描述 高铁城市圈对人们的出行 经济的拉动效果明显 每年都会规划新的高铁城市圈建设 在给定城市数量 可建设高铁的两城市间的修建成本列表 以及结合城市商业价值会固定建设的两城市建高铁 请你设计算法 达到修建城市高铁的最低成本 注意 需要满足
  • Go语言入门【09】结构体

    结构体 相比于Java 在Go语言中没有类的概念 但是多了结构体 结构体与Java中的类很像 是表示一系列同一类型或不同类型的数据构成的数据集合 例如可以将学生抽象成一个结构体 每一个学生有以下属性 Name 姓名 Age 年龄 Gende