01-go基础-10-结构体 struct (定义结构体、声明结构体变量、结构体赋值、结构体做参数、结构体指针、结构体嵌套、结构体打印)

news2024/12/26 23:15:29

文章目录

  • 1. 定义结构体类型
  • 2. 声明结构体变量
  • 3. 赋值
    • 3.1 用结构体赋值
    • 3.2 每个成员分别赋值
  • 4. 结构体使用
    • 4.1 结构体作参数
    • 4.2 结构体指针做参数
    • 4.3 二者区别
    • 4.4 本质原因
  • 5. 结构体嵌套
    • 5.1 一个结构体作为另一个结构体的成员
      • 1)定义
      • 2)赋值和引用
      • 3)完整示例
    • 5.2 直接引入另一个结构体的所有成员
      • 1)定义
      • 2)赋值和引用
      • 3)完整示例
  • 6. 结构体打印
    • 6.1 仅打印值
    • 6.2 打印成员名和值

1. 定义结构体类型

  • 语法
type 结构体名称 struct {
   成员1  类型
   成员2  类型
   ...
}
  • 示例
type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

2. 声明结构体变量

  • 代码
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
}

func main() {
	var xiShu XiShu
	fmt.Printf("结构体为:%+v",xiShu)

}
  • 结果
结构体为:{ID:0 Name: Age:0}

示例可见:声明结构体变量之后,结构体不为空,结构体每个成员都为默认值(字串默认值为空,int 默认值为 0)。

3. 赋值

3.1 用结构体赋值

  • 语法
结构体名 =  结构体类型{ 成员1:1, 成员2:2,... }
  • 代码
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
}

func main() {
	xiShu := XiShu{
		ID: 1,
		Name: "刘备",
		Age: 28,
	}

	fmt.Printf("结构体为:%+v",xiShu)

}
  • 结果
结构体为:{ID:1 Name:刘备 Age:28}

3.2 每个成员分别赋值

  • 语法
结构体名.成员1 = 值
结构体名.成员2 =
  • 示例
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
}

func main() {
	var xiShu XiShu
    xiShu.Name = "刘备"
    xiShu.Age = 28

	fmt.Printf("结构体为:%+v",xiShu)

}

结果显示

结构体为:{ID:0 Name:刘备 Age:28}

4. 结构体使用

4.1 结构体作参数

  • 代码
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

//checkAge 定义函数,以结构体做参数。
func checkAge(info XiShu)(result string) {
	if info.Age >= 18 {
		result  = info.Name+"是一个成年人"
		return result
	}else {
		info.Name = "小"+info.Name
		result = info.Name+"还没有长大"
		return result
	}
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}

	result := checkAge(liuBei)
	fmt.Println(result)
}
  • 结果输出
刘备是一个成年人

4.2 结构体指针做参数

  • 代码
  • 结构体指针可以直接使用,不需要多余操作。
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}
//info 是一个结构体的指针
func checkAge(info *XiShu)(result string) {
	if info.Age >= 18 {
		result  = info.Name+"是一个成年人"
		return result
	}else {
		info.Name = "小"+info.Name
		result = info.Name+"还没有长大"
		return result
	}
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
     //将结构体liuBei的指针传入函数
	result := checkAge(&liuBei)
	fmt.Println(result)
}

4.3 二者区别

  • 结构体做参数,变化不会影响函数外
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

func IncreaseAge(info XiShu)(age int) {
        info.Age += 1
		fmt.Printf("函数中构体:\t%+v\n",info)
		age = info.Age
		return age
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
	fmt.Printf("原结构体:\t%+v\n",liuBei)
	IncreaseAge(liuBei)

	fmt.Printf("当前结构体:\t%+v\n",liuBei)
}

结果

原结构体:	{ID:0 Name:刘备 Age:28 Position:主公}
函数中构体:	{ID:0 Name:刘备 Age:29 Position:主公}
当前结构体:	{ID:0 Name:刘备 Age:28 Position:主公}

如上可见,结构体值变化不会影响函数外。

  • 结构体指针做参数,变化影响全局
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

func IncreaseAge(info *XiShu)(age int) {
        info.Age += 1
		fmt.Printf("函数中构体:\t%+v\n",info)
		age = info.Age
		return age
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
	fmt.Printf("原结构体:\t%+v\n",liuBei)
	IncreaseAge(&liuBei)

	fmt.Printf("当前结构体:\t%+v\n",liuBei)
}

结果:

原结构体:	{ID:0 Name:刘备 Age:28 Position:主公}
函数中构体:	&{ID:0 Name:刘备 Age:29 Position:主公}
当前结构体:	{ID:0 Name:刘备 Age:29 Position:主公}

如上可见,结构体数据彻底放生变化

4.4 本质原因

  • 说明:

函数中的形参和函数外的实参内存地址是不同的。
参数传递时,函数中的形参复制了函数外实参的值,函数结束后形参地址将被释放,这些不会对实参造成影响。

  • 示例

我们将实参的地址作为第二个参数传入函数,然后和第一个形参的地址做比较。

ackage main

import (
	"fmt"
)

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

func IncreaseAge(info XiShu,xiShu *XiShu) {
	fmt.Printf("比较形参和实参地址:")
     if &info == xiShu {
		 fmt.Println("相同")
	 }else {
		 fmt.Println("不同")
	}

}

func main () {
	//liuBei := new(XiShu)
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
	IncreaseAge(liuBei,&liuBei)
}

结果:

比较形参和实参地址:不同

5. 结构体嵌套

5.1 一个结构体作为另一个结构体的成员

1)定义

  • 语法
type StructName02 struct {
	……
	MemberName StructName01
}
  • 语法示例
type XiShu struct {
	ID int
	Name string
	Age int
	Position string
	Equipment Equipment
}

type Equipment struct {
	Arms string
	Horse string
}

2)赋值和引用

  • 语法
StructName02.MemberName.StructName01Menber
  • 示例(用结构体赋值)

用结构体赋值只能使用StructName02.MemberName.StructName01Menber的方法

	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
		Equipment: Equipment{
			Arms: "双股剑",
			Horse: "的卢",
		},
	}
  • 示例(单个成员赋值)

单个赋值语法中两种方法都可以

	liuBei.Equipment.Arms = "双股剑"

3)完整示例

  • 代码
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
	Equipment Equipment
}

type Equipment struct {
	Arms string
	Horse string
}


func main () {
    //可以用结构体赋值
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
		Equipment: Equipment{
			Arms: "双股剑",
			//Horse: "的卢", //为了展示直接对成员赋值,此处先注释掉
		},
	}
	//也可以直接对成员赋值
	liuBei.Equipment.Horse = "的卢"
	fmt.Printf("%+v",liuBei)
}
  • 结果
{ID:0 Name:刘备 Age:28 Position:主公 Equipment:{Arms:双股剑 Horse:的卢}}

5.2 直接引入另一个结构体的所有成员

1)定义

  • 语法
type StructName02 struct {
	……
	StructName01
}
  • 语法示例
type XiShu struct {
	ID int
	Name string
	Age int
	Position string
	Equipment
}

type Equipment struct {
	Arms string
	Horse string
}

2)赋值和引用

  • 语法
StructName02.StructName01Menber

StructName02.MemberName.StructName01Menber
  • 示例(用结构体赋值)

用结构体赋值只能用StructName02.MemberName.StructName01Menber的结构,而不能使用StructName02.StructName01Menber的结构

	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
		Equipment: Equipment{
			Arms: "双股剑",
			Horse: "的卢",
		},
	}

如上,不能写成:

	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
		Arms: "双股剑", //不能这么写
		Horse: "的卢", //不能这么写
		},
	}
  • 示例(单个成员赋值)

StructName02.MemberName.StructName01Menber的结构和StructName02.StructName01Menber的结构都可以。

	liuBei.Arms = "双股剑"

	liuBei.Equipment.Arms = "双股剑"

3)完整示例

  • 代码
package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
	Equipment
}

type Equipment struct {
	Arms string
	Horse string
}


func main () {
	//用结构体赋值
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
		//Equipment: Equipment{  //为了展示单个成员赋值效果,此处可以注释掉
		//	Arms: "双股剑",
		//	Horse: "的卢",
		//},
	}
	//直接引用`Equipment`的成员
	liuBei.Arms = "双股剑"
	//通过Equipment引用其成员
	liuBei.Equipment.Horse = "的卢"

	fmt.Printf("%+v",liuBei)
}

  • 结果
{ID:0 Name:刘备 Age:28 Position:主公 Equipment:{Arms:双股剑 Horse:的卢}}

注意,虽然Equipment的成员可以直接引用,但是打印出的结果依然在Equipment下。

6. 结构体打印

6.1 仅打印值

  • 语法示例
fmt.Println(StructName)
  • 完整示例

代码:

package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
	
	fmt.Println(liuBei)
}

结果输出

{0 刘备 28 主公}

6.2 打印成员名和值

  • 语法示例
	fmt.Printf("%+v",StructName)
  • 完整示例

代码:

package main

import "fmt"

type XiShu struct {
	ID int
	Name string
	Age int
	Position string
}

func main () {
	liuBei := XiShu{
		ID: 0,
		Name: "刘备",
		Age: 28,
		Position: "主公",
	}
	
	fmt.Printf("%+v",liuBei)
}

结果输出

{ID:0 Name:刘备 Age:28 Position:主公}

在这里插入图片描述

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

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

相关文章

RabbitMQ的学习

MQ引言 什么是MQ MQ(Message Quene):翻译为消息队列,通过典型的生产者和消费者模型生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有…

【MySQL 原理篇】- 凭这个,我拿下字节面试

若是想查看原图,请点击这里 刘卡卡 | ProcessOn 超链接 索引 从存储结构上看,有哪些索引从存储结构上来划分:BTree索引(B-Tree或BTree索引),Hash索引,full-index全文索引,R-Tree索…

[附源码]Python计算机毕业设计Django在线票务系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

JavaEE

文章目录前言JRE与JDK区别JAVASE、JAVAEE、JAVAME区别Dos常用命令为什么需要Path环境变量配置前言 📋前言📋 💝博客:【无聊大侠hello word】💝 ✍有一点思考,有一点想法,有一点理性!…

关于有限元应力结果精度的几点讨论

1引言 作为一名汽车结构CAE工程师,使用有限元法进行应力分析是我多年的日常工作。但是关于有限元应力结果的一些技术点一直未能吃透,查到的相关文献也不多,文献内容也存在很多不尽不实之处。最近一段时间,抽空重新读了一遍王勖成…

泊松分布一

文章目录1. 泊松分布定义2.泊松分布具体实例实例1:实例2:3.生成泊松分布的代码泊松分布适合于描述单位间隔(时间、距离、面积、体积)内随机事件发生的次数的概率分布。如电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的…

【Android】用无障碍服务整个脚本——我看刑

本文灵感来源:李跳跳真实好友 app 目录无障碍服务(AccessibilityService)模拟点击组件ID & 组件文本坐标后台保活效果图存在缺陷缺陷一缺陷二缺陷三缺陷四无障碍服务(AccessibilityService) 无障碍服务(AccessibilityService),是Google推出为了帮助…

从零搭建Sentry

前言 Sentry 为一套开源的应用监控和错误追踪的解决方案。这套解决方案由对应各种语言的 SDK 和一套庞大的数据后台服务组成。应用需要通过与之绑定的 token 接入 Sentry SDK 完成数据上报的配置。通过 Sentry SDK 的配置,还可以上报错误关联的版本信息、发布环境。…

四信机房环境监测方案上线 实现集中监控,统一管理

随着“东数西算”工程和新基建的加速落地,数智化技术正逐渐渗透到各领域。以机房行业为例,由于数据中心建设规模的逐步壮大,机房设备市场需求同步增长,为行业用户带来更多可能性。 伴随着机房中设备数量不断增多,如何…

Vue2实现浏览器ctrl+f功能

Vue2实现浏览器ctrlf功能 安装插件 使用一个Vue2的插件search-bar-vue2 npm install search-bar-vue2全局注册 //全局注册 import SearchBar from search-bar-vue2 Vue.use(SearchBar)局部注册 <template><div><search-bar :root"#app" :highlig…

【VUE】实现分页组件

&#x1f4d8;前言 &#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. &#x1f4a8;&#x1f4a8;&#x1f4a…

Navigation--导航机理

1.ROS navigation为移动机器人导航相关包的集合&#xff0c;实现定位规划避障等相关功能。 整体工作流程为&#xff1a; 1.加载地图 navigation通过map_server加载现有地图。navigation无建图相关包&#xff0c;需另外实现后保存&#xff0c;默认只支持2维地图&#xff0c;其…

[附源码]Python计算机毕业设计Django游戏商城平台论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

推荐测试用例管理工具,看这篇就行。

我们在考虑测试用例管理的时候&#xff0c;其实不能单纯考虑测试用管理&#xff0c;因为你的测试用例是需要和需求关联起来的&#xff0c;是需要和 bug 关联起来的。在有些行业&#xff0c;比如汽车、医药&#xff0c;不仅要对需求进行测试&#xff0c;还需要对架构设计、详细设…

某CCF C会议对国内和国外作者实行两套标准, 引27%+中稿者发声!

点击文末公众号卡片&#xff0c;不错过计算机会议投稿信息 本文主要反映轻松参会交流群内UIC22(CCF C类) 的81位国内中稿作者的诉求&#xff08;占UIC22中稿数的27%&#xff09;。目前群内作者们的诉求为&#xff0c;希望国内作者可选择线上参会。因为线下参会有困难&#xff0…

2023年湖北监理工程师报考时间是什么时候?

2023年湖北监理工程师报考时间是什么时候&#xff1f; 监理工程师考试时间虽说是全国统一的&#xff0c;但是监理工程师报名时间不统一&#xff0c;每个省份自行安排报名时间&#xff0c;监理工程师报名时间基本都是在2.3月份开始报名&#xff0c;具体关注每个省人事考试院网站…

文件包含漏洞(原理及介绍)

文件包含漏洞&#xff08;原理及介绍&#xff09; File inclusion&#xff0c;文件包含&#xff08;漏洞&#xff09;。程序开发人员通常出于灵活性的考虑&#xff0c;会将被包含的文件设置成变量&#xff0c;然后动态调用这些文件。但正是因为调用的灵活性导致用户可能调用一…

flex布局子项属性

flex布局子项属性 1、flex属性 源代码 flex属性定义子项目分配剩余空间&#xff0c;用flex来表示占多少份数 flex: number; 填数值&#xff0c;分配剩余空间的占比 2、align-self控制子项自己在侧轴上的排列方式 源代码 align-self属性允许单个项目有…

Semi-Supervised Classification with Graph Convolutional Networks

Semi-Supervised Classification with Graph Convolutional Networks, ICLR, 2017 要点&#xff1a; 1、可扩展的半监督学习方法 2、基于卷积神经网络的有效变体&#xff0c;直接对图进行操作 3、通过谱图卷积的局部一阶近似来激励卷积架构的选择 4、在图的边数上进行线性缩放…

车辆纵向动力学、加速性能和燃料消耗研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 车辆纵向动力学方面包括车辆传动系统换挡控制、制动系统的设计与控制以及车辆状态的参数估计;车辆横向动力学方面涉及车辆转向…