Go语言入门【09】结构体

news2025/1/19 20:30:25

结构体

相比于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
}

运行结果:

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

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

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

相关文章

基于pytorch搭建CNN 对人像是否戴口罩进行检测分类 详细教程

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…

A-Level/IB/AP不同课程体系分数可以相互转换吗?

都知道国际学校有不同的课程体系,也会有不同的考试体系。比如A-Level、IB、SAT/ACT和AP;甚至还有国内的高考体系。所以可能有同学家长会问,不同体系之间的分数是否能够进行对比呢? 严格来讲,其实不好对比,但…

wy的leetcode刷题记录_Day59

wy的leetcode刷题记录_Day59 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2022-12-9 前言 目录wy的leetcode刷题记录_Day59声明前言1780. 判断一个数字是否可以表示成三的幂的和题目介绍思路代码收获63. 题目题目介绍思路代码收获178…

m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 许多室内应用需要有关物体的空间信息。示例应用程序包括项目查找,对象级别映射和在仓库或库中管理的大型对象。然而,使用802.11,可见光或声学的基于位置的服务…

浏览器里console是异步的

console我一直以为是同步执行的,直到在一本书上看到,才了解到console本身有异步的特性。虽然在平常开发中经常使用console,但是真的没有意识到它的异步性。 下面就看下异步的实例 基础类型 该类型是我们开发中经常使用的,正是这…

01VSCode配置Anaconda 环境和调试环境

VSCode配置Anaconda 环境 Anaconda 简介 自带Python解释器Anaconda 附带了一大批常用数据科学包150 多个科学包及其依赖项Anaconda 是在 conda(一个包管理器和环境管理器)上发展出来的,包含了虚拟环境管理工具通过虚拟环境可以使不同的Pyth…

【Python深度学习】RNN循环神经网络结构讲解及序列回归问题实战(图文解释 附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 循环神经网络 循环神经网络(Recurrent Neural Network,RNN)是用于对序列的非线性特征进行学习的深度神经网络。循环神经网络的输入是有前后关联关系的序列。 循环神经网络可以用来解决与序列…

python数据预处理时缺失值的不同处理方式!

在使用python做数据分析的时候,经常需要先对数据做统一化的处理,缺失值的处理是经常会使用到的。 一般情况下,缺失值的处理要么是删除缺失数据所在的行,要么就是对缺失的单元格数据进行填充。 今天介绍的是使用差补法/均值/固定…

CSS -- 08. 移动WEB开发之流式布局

文章目录移动WEB开发之流式布局1 移动端基础1.1 浏览器现状1.2 手机屏幕现状1.3 移动端调试方法2 视口2.1 布局视口 layout viewport2.2 视觉视口 visual viewport2.3 理想视口 ideal viewport2.4 meta视口标签3 二倍图3.1 物理像素&物理像素比3.2 多倍图3.3 背景缩放 back…

clickhouse-部署指南(亲测超详细)

文章目录环境要求测试环境Tar方式安装clickhouse用户授权访问控制服务配置启动连接测试TABIX webUI性能测试环境要求 ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行 官方预构建的二进制文件通常针对x86…

prometheus+grafana对数据库mysql监控

安装 mysql docker run --name mysql-test -p MYSQL ROOT_PASSWORD123456 -p23306:3306 mysql:5.7.26启动镜像的时候 已经是把docker容器内部的3306端口 映射到本机了 直接通过navicat连上 进入mysql容器内部 docker exec -it 容器id /bin/bash, 启动 mysql. docker start d…

33.flink cdc 实时数据同步利器

什么是flink cdc? 对很多初入门的人来说是无法理解cdc到底是什么个东西。 有这样一个需求,比如在mysql数据库中存在很多数据,但是公司要把mysql中的数据同步到数据仓库(starrocks), 数据仓库你可以理解为存储了各种各样来自不同数据库中表。 数据的同步…

2-2-3-7、FutureCompletableFuture详解

Runnable 线程的任务接口,用于定义被执行任务方法的抽象,是函数式接口(仅存在一个需要实现方法的接口),其方法为run方法通过对并发编程中java线程的了解,Thread调用start方法,最后操作系统会通过…

Confluence 调整会话超时(session timeout)

文章目录前言一、概括二、实际场景应用1.更改空闲超时2.更改记住我 cookie 的生命周期3.在用户通过身份验证后的某个时间强制注销用户总结前言 在 Confluence 中有两个会话 Cookie: JSESSIONID: 由 Tomcat 使用和管理。 默认情况下,这被视为会话 cooki…

类与对象(中)

类与对象类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特性赋值运算符重载运算符重载赋值运算符重载前置 后置 重载const成员函数取地址及const取地址操作符重载类的6个默认成员函数 当类中没有任何成员时,称作空类 但是呢,编译…

Docker使用(容器、镜像相关命令)

虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割…

虹科方案|将以太网连接添加到Dell EMC PowerVault™ ML3 SAS库

一、Dell EMC 和 ATTO 磁带解决方案 Dell EMC 和 ATTO 提供了业界唯一的商用解决方案,可将高速以太网连接添加 到标准 SAS LTO 磁带驱动器。ATTO XstreamCORE ET 8200 智能网桥允许您使用 iSCSI 和 iSER 协议通过标准以太网远程连接到 SAS 磁带驱动器。当与采用最新…

花 2 个月备战字节跳动Java岗,3 轮面试拿下 60W Offer

最近收到一位刚入职字节的 Java 工程师朋友投稿——以下内容来自其亲身经历,某双非硕士拿到 字节 60W offer ,感谢他的走心分享(文末附硬货笔记) PART1:个人情况简介 菜 J 一枚,本硕都是计算机&#xff08…

[论文阅读] SqueezeSeg V1

文章目录1. 主要思想2. 具体方法2.1 数据处理方式2.2 网络架构3. 实验支撑4. 总结启示5. 相关文献paper 原论文的链接 code: 源代码链接 paper全称:SqueezeSeg: Convolutional Neural Nets with Recurrent CRF for Real-Time Road-Object Segmentation from 3D LiDA…

【02】FreeRTOS获取10.4.6源码+移植到STM32F407步骤

目录 1.获取FreeRTOS源码 1.1 FreeRTOS官网下载步骤 1.2FreeRTOS源码内容 1.3FreeRTOS内核文件 1.3.1Demo文件夹 1.3.2Source文件夹 2.FreeRTOS移植 2.1添加FreeRTOS源码 2.1.1复制FreeRTOS源码 2.1.2将文件添加到工程 2.1.3添加头文件路径 2.2添加FreeRTOS.h 2.3修改SYS…