【go语言】入门go语言结构体

news2024/11/15 7:36:50

结构体的定义

结构体是一种用户自定义的数据类型,它由一组字段组成,每个字段可以是任意基本类型或其他结构体类型。结构体在Go语言中被广泛使用,它可以用来表示复杂的数据结构,比如二叉树、链表、图等。

结构体的形式如下:

type name struct{
    value1 type1
    value2 type2
    ......
}

下面是一个实际一点的例子

type Person struct {
    name string
    age int
    sex string
}

上面的代码定义了一个名为Person的结构体,它有三个字段,分别是name、age和sex,它们的类型分别为string、int和string。通过这个结构体就可以表示一个人的基本信息。

结构体的创建

type Person struct {
    name string
    age int
    sex string
}
  1. 使用new
    ms:=new(myStruct)
  2. 使用结构体字面量
    var ms myStruct
  3. 间接使用new创建
    ms:=&msStruct{"张三",18,"男"}

初始化结构体

ms:={“张三”,18,“男”}
这种方法初始化必须按照字段在结构体定义是的顺序填写

ms:={name:“张三”,sex:“男”}
这种方法指定某些字段的值,不必按照顺序,而且一些字段可以被忽略,这里的age字段被忽略且值为0

结构体值的使用

结构体是Go语言中的核心组件,用于组织和表示复杂的数据结构。一旦我们有了结构体的实例(也称为结构体值),如何使用它们呢?这部分将详细讨论如何访问、修改和利用结构体的值。

访问结构体的字段

每个结构体的字段都可以通过.运算符来访问。

type Book struct {
    Title  string
    Author string
    Price  int
}

// 创建一个Book类型的实例
myBook := Book{"", "Alan A. A. Donovan", 38}

// 访问结构体字段
title := myBook.Title

我们定义了一个Book结构体并初始化了一个myBook实例。使用.运算符访问myBook的Title字段。

修改结构体的字段

可以直接通过=赋值运算符修改结构体的字段。

// 修改结构体字段
myBook.Pages = 400

我们使用前面创建的myBook实例,直接为myBook的Pages字段赋新值,myBook的Pages字段值现在为400。

结构体的使用

import(
    "fmt",
    "string"
)
type Person struct{
	firstName string
	lastName string
}
func upPerson(p *Person){
	p.firstName=strings.ToUpper(p.firstName)
	p.lastName=strings.ToUpper(p.lastName)
}
func main(){
    var per1 Person
	per1.firstName="zhang"
	per1.lastName="sang"
	upPerson(&per1)
	fmt.Printf("这个人的名字是%s %s\n",per1.firstName,per1.lastName)

	per2:=new(Person)
	per2.firstName="zhang"
	per2.lastName="sang"
    upPerson(&per2)
	fmt.Printf("这个人的名字是%s %s\n",per2.firstName,per2.lastName)

	per3:=&Person{"zhang","sang"}
    upPerson(per3)
	fmt.Printf("这个人的名字是%s %s\n",per3.firstName,per3.lastName)
}

在这里插入图片描述
注意
由于go的类型转换规则非常严格,当给一个结构体a取别名b,类型为a和类型为b的变量相互赋值时就要进行类型转换

type number struct{
		f int
}
type nb number
a:=number{1}
b:=nb{2}
a=b
//取了别名就不能直接赋值了a=b
//需要类型转换
//a=number(b)
fmt.Println(a)

在这里插入图片描述

结构体作为函数参数

结构体也可以被用作函数的参数,允许我们在函数内部操作结构体的值。

示例:

func PrintBookInfo(b Book) {
fmt.Printf(“Title: %s, Author: %s, Pages: %d\n”, b.Title, b.Author, b.Pages)
}

// 使用函数
PrintBookInfo(myBook)
输入:我们定义了一个PrintBookInfo函数,其参数为Book类型,并使用了myBook实例作为参数。

处理过程:在函数内部,我们访问结构体的各个字段,并打印其值。

输出:控制台输出书籍的详细信息。

结构体中的匿名字段

匿名字段就是没有名字只有类型的字段,在一个结构体中一种类型只能有一个匿名字段。

通过这个可以模拟类似继承的行为

type first struct{
    f1 int
    f2 int
}
type second struct{
    s1 int
    s2 int
    first
}
func main(){
    sec:=new(second)
    sec.s1=1
    sec.s2=2
    sec.f1=3
	sec.f2=4
	fmt.Println(sec)
}

在这里插入图片描述

结构体嵌套产生的命名冲突

当一个结构体中两个字段有相同的名字的时候就会发生命名冲突(通过匿名字段实现继承的时候)
比如下面这几个例子

  • 相同名字在同层次结构体中出现
type A struct{
    a int
}
type B struct{
    a int
    b int
}
type C struct{
    A
    B
}
var c C
c.a

使用c.a就会报错,因为编译器分不清是c.A.a还是c.B.a
在这里插入图片描述

  • 相同名字字段在不同结构体层次出现
type D struct{
    B
    b float32
}
var d D
d.b

这里使用d.b就没有问题,d.b和d.B.b是可以区分的。

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

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

相关文章

SpringBoot青海省旅游系统

本系统采用基于JAVA语言实现、架构模式选择B/S架构,Tomcat7.0及以上作为运行服务器支持,基于JAVA、JSP等主要技术和框架设计,idea作为开发环境,数据库采用MYSQL5.7以上。 开发环境: JDK版本:JDK1.8 服务器…

【boost网络库从青铜到王者】第七篇:asio网络编程中的异步echo服务器,以应答为主

文章目录 1、简介2、echo模式应答异步服务器2.1、Session会话类2.2、Server类为服务器接收连接的管理类 3、客户端4、隐患5、总结 1、简介 前文已经介绍了异步操作的api,今天写一个简单的异步echo服务器,以应答为主。 2、echo模式应答异步服务器 2.1、…

R | R包默认安装路径的查看及修改

R | R包默认安装路径的查看及修改 一、R包安装位置查看二、已安装R包查询三、R包安装位置修改四、R包安装位置永久修改 在【R: R package安装的几种方式】【R: R版本更新及R包迁移(详细步骤)】两篇文章中介绍过R包的常见安装方式,以及在不同R…

一道求导题:1004T3

需要知识: ( x n ) ′ n x n − 1 (x^n)nx^{n-1} (xn)′nxn−1 ( s i n x ) ′ c o s x (sinx)cosx (sinx)′cosx [ f ( g ( x ) ) ] ′ f ′ ( g ( x ) ) g ′ ( x ) [f(g(x))]f(g(x))\times g(x) [f(g(x))]′f′(g(x))g′(x) 推完之后,考虑导函数与x轴的交点…

测试2023

1 企业级全栈测试平台 RunnerGO 1.1 Flow流拖拽自由组合,实时协作和共享 Flow自由拖拽自由组合,可以实现在进行一个接口后并发执行后续的步骤 接口自定义权重,根据Flow流自由组合配合接口自定义权重可以模拟真实业务分流的场景 全链路场景&am…

Tomcat基础与优化

Tomcat介绍 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat具有处理HTML页面的功能,通常作为一个Servlet和JSP容器,单独运行…

“在 ArchiMate EA 建模中的组合关系:构建块和依赖关系

简介 在企业架构(EA)建模领域,结构关系在描绘架构内静态一致性方面起着至关重要的作用。其中一个关键的结构关系是组合关系,这是 ArchiMate 语言中深植的概念,提供了一个全面的框架,用于表达元素如何组合形…

C++的继承基础和虚继承原理

1.继承概念 “继承”是面向对象语言的三大特性之一(封装、继承、多态)。 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性基础上进行扩展,增加功能&…

COO、CSR、adj_coo、adj_csr详解:稀疏矩阵与稀疏邻接矩阵的存储格式及转换

文章目录 一、COO二、CSR三、adj_coo四、adj_csr五、格式转换代码 稀疏图:数据结构中对于稀疏图的定义为:有很少条边或弧(边的条数 ∣ E ∣ |E| ∣E∣ 远小于 ∣ V ∣ 2 |V|^2 ∣V∣2)的图称为稀疏图,反之边的条数 …

Leetcode 231.2的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出:tr…

vs2015 报错“无法找到要定向的合适SDK”

关于Visual Studio:找不到合适的SDK来定位 | 码农家园 报错如下: 解决如下:

在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…

办公网络构建

办公网络项目背景 XX州市益智软件科技有限公司是XX市第九职业技术学校校办企业,依托学校人力技术、场地资源,面向市场独立经营、服务社会,主要从事网络设备销售、网络综合布线与网络管理。该公司现租用实训基地二层作为公司的办公经营场地…

为何需关注各ZKP方案的benchmarks?

1. 引言 近期,研究人员和工程人员有大量关于谁是最好的证明系统的争论: 2023年8月29日,StarkWare团队对比了FRI和KZG2023年8月30日,JustinThaler和Srinath Setty讨论FRI和KZG谁的性能更佳? 不过,在深入be…

小谈设计模式(17)—状态模式

小谈设计模式(17)—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRe…

IIC控制器(2):PS端

书接上文: I2C控制器练习(1)_NoNoUnknow的博客-CSDN博客 SPI协议与FPGA的自动升级和多启动-CSDN博客 本文主要做一些基本知识的补充和工程参考。 写IIC需要注意的事情: 1.查询芯片手册获得slave地址,以及寄存器地址…

『力扣每日一题12』:只出现一次的数字

一、题目 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&…

MySQL备份恢复

MySQL日志管理 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了。 MySQL日志类型 日志类型计入文件中的信息类型错误日志记录启…

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果: 运行截屏(p50e) apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法: blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

uniapp项目实践总结(二十七)苹果应用商店上架教程

导语:之前介绍了如何打包一个苹果安装包文件,如果想要上架苹果 ios 应用商店,那么就来这里学习一下方法吧。 目录 准备材料上架步骤审核事项 准备材料 基本信息 构建版本:需要一个 ipa 格式安装包;logo&#xff1a…