go 语言程序设计第4章--复合数据类型

go 语言程序设计第4章–复合数据类型

书籍源代码链接

四种复合数据类型,分别是数组、slice、map 和结构体。
数组和结构体都是聚和类型,他们的值由内存中的一组变量构成。数组和结构体的长度都是固定的。slice 和 map 都是动态数据结构,他们的长度在元素添加到结构时可以动态增长。

4.1 数组

q := […]int{1,2,3} // 说明数组的长度由初始化数组的元素个数决定。
fmt.Printf(“%T\n”, q) // [3]int

数组的长度是数组类型的一部分,所以 [3]int 和 [4]int 是不同的数组类型。

r := […]int{99: -1}
定义了一个拥有100个元素的数组 r,除了最后一个元素值是 -1 外,该数组中的其他元素值都是 0。

如果一个数组的元素类型是可比较的,那么这个数组也是可比较的,这样我们就可以直接使用 == 比较两个数组的元素的值是否完全相同。

当调用一个函数的时候,每个传入的参数都会创建一个副本。Go把数组和其他的类型都看成值传递。

package mainimport "fmt"func change(ar [3]int) {ar[0] = ar[0] + 1
}
func main() {q := [...]int{1, 2, 3}change(q)fmt.Println(q[0])}

4.2 slice

slice 表示一个拥有相同类型元素的可变长度的序列。 slice 通常写成[]T,其中元素的类型都是 T; 它看上去像没有长度的数组类型。

slice 是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素。slice 有三个属性:指针、长度和容量。

slice 无法比较,不能用 == 比较两个 slice。

make 可以创建一个具有指定元素类型、长度和容量的 slice。

4.2.1 append 函数

var runes[] rune
for _, r := range "Hello, 世界" {runes = append(runes, r)
}
fmt.Printf("%q\n", runes)

4.2.2 slice 就地修改

rotate 和 reverse 可以就地修改 slice,传递给函数的 slice 变量在函数中修改后,返回后可以看到修改的值。这点和数组不一样。

4.3 map

map 的类型是 map[K]V, 其中 K 和 V是字典的键和值对应的数据类型。

内置函数 make 可以用来创建一个 map:

ages := make(map[string]int)

或者使用 map 的字面量。

ages := map[string]int {"alice": 31,"charlie": 34,
}

不可以获取 map 元素的地址,因为 map 的增长可能导致已有元素被重新散列到新的存储位置。

可以使用 for 循环(结合 range)来变量map 中所有的键和对应的值。

for name, age := range ages {fmt.Printf("%s\t%d\n", name, age)
}

map 类型的零值是 nil,也就是说,没有引用任何散列表。

var ages map[string]int
fmt.Println(ages == nil) // "true"
fmt.Println(len(ages) == 0) // "true"
if age, ok := ages["bob"]; !ok {}

和 slice 一样,map 不可比较。

4.4 结构体(Struct)

type Employee struct {ID intName string
}
type tree struct {value intleft, right  *tree
}

4.4.1 结构体字面量

第一种:为每个成员变量指定一个值。

type Point struct{ X, Y int}
p := Point{1, 2}

第2种:通过指定部分或者全部成员变量的名称和值来初始化结构体变量。

gif.GIF{LoopCount: nframes}

大型结构体通常使用结构体指针的方式直接传递给函数或者从函数中返回。这种方式在函数需要修改结构体内容的时候也是必须的。

4.4.2 结构体比较

如果结构体所有的成员都可以比较,那么这个结构体就是可以比较的。

4.4.3 结构体嵌套和匿名成员

type Point struct {X, Y int
}type Circle struct {PointRadius int
}

可以访问

var c Circle
c.X = 8

构建
c = Circle{Point{8, 8}, 5}

4.5 JSON

Go 对象可以和 JSON 相互转换。Go 对象转成 JSON 成为 marshal。JSON 转换为 Go 对象为 unmarshal

4.6 文本和 HTML 模板

模板是一个字符串或者文件,它包含一个或者多个两边用双大括号包围的单元–{{…}}, 这成为操作

TODO:

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

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

相关文章

mysql保姆安装教程

一.下载install文件 1.进入Mysql官网,点击下载 2.选择MySQL Installer for Windows 3.推荐选择第二个安装包 4.不登陆,开始下载 5.等待下载完成 二.安装前的配置 通过电脑“设置”,检查电脑是否包含中文名,如果包含请重命名 …

C语言 for 循环的所有应用

当使用for循环时&#xff0c;它提供了一种在特定条件下重复执行代码块的方法。以下是一些详细的示例&#xff1a; 基本用法&#xff1a; // 打印数字1到5 for (int i 1; i < 5; i) {printf("%d ", i); } // 输出结果&#xff1a;1 2 3 4 5遍历数组&#xff1a;…

紫光展锐5G扬帆出海 | 东南亚成为5G新热土

东南亚是一块充满活力和潜力的市场&#xff0c;这里人口基数大、年轻消费群体占比高&#xff0c;电子市场在过去几年显著增长。 增速“狂飙”的东南亚手游 近年来&#xff0c;东南亚手游下载量逐年增长&#xff0c;2023 年第一季度下载量突破 21 亿次&#xff0c;贡献了全球近…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo&#xff1a;CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

【SD】IP-Adapter 进阶 - 同款人物【2】

测试模型&#xff1a;###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图&#xff1a; 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …

VR室内设计仿真教学情景实训

在传统的室内设计教学中&#xff0c;学生往往只能通过想象和图纸来理解空间布局和设计理念。然而&#xff0c;VR技术的出现&#xff0c;使得这一切变得可能。学生可以通过VR设备&#xff0c;身临其境地感受空间布局&#xff0c;观察光线、色彩、材质等元素如何相互作用&#xf…

Unity中Shader 齐次坐标

文章目录 前言一、什么是齐次坐标二、齐次坐标增加分量 w 的意义1、当 w ≠ \neq  0时&#xff1a;2、当 w 0时&#xff1a;3、用方程组&#xff0c;直观的看一下w的意义 前言 在之前的文章中&#xff0c;我们进行了正交相机视图空间转化到裁剪空间的推导。 Unity中Shade…

确保RPA增效提速,这4大风险需注意

如今&#xff0c;已经有越来越多的企业选择实施RPA&#xff0c;将其看作是业务流程优化的利器。如何顺利实施RPA并获得最佳效果&#xff1f; RPA的应用案例&#xff0c;产品及服务遍布新零售、电商、物流、制造、医疗健康、基层政务、互联网教育、企业服务等行业&#xff0c;以…

三大强势大语言模型怎么选?看这篇文章就够了!

现在的人可以有多懒&#xff1f;啊&#xff0c;不&#xff0c;是多聪明&#xff1f;&#xff08;毕竟人和动物的根本区别在于能否制造和使用工具。&#xff09; 遇到任何事情&#xff0c;可以随时大小问。你甚至都不需要手动输入&#xff0c;因为语言输入已经帮你简化了这个步…

linux调试笔记

文章目录 基本启动调试与附加进程断点程序运行控制tui模式查看堆栈与变量监视变量多线程调试 扩展自定义跳转命令解析自定义类型禁用动态库自动加载设置源码路径断点时执行命令gdbserver远程调试 gdb脚本QtCreator调试Linux下处理编译、运行时的一些问题undefined symbol问题-n…

跨域问题解决方案

何为跨域 跨域&#xff08;Cross-Origin&#xff09;指的是在浏览器中&#xff0c;当一个页面&#xff08;或域&#xff09;的 JavaScript 代码试图访问另一个域的资源时&#xff0c;浏览器会阻止该跨域请求。这是由于浏览器的同源策略&#xff08;Same-Origin Policy&#xf…

LeetCode 2660. 保龄球游戏的获胜者:模拟

【LetMeFly】2660.保龄球游戏的获胜者&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/determine-the-winner-of-a-bowling-game/ 给你两个下标从 0 开始的整数数组 player1 和 player2 &#xff0c;分别表示玩家 1 和玩家 2 击中的瓶数。 保龄球比…

c++ - 函数的模板特化

目录 模板特化 全特化 偏特化 模板特化 模板进行特化 即&#xff1a; 在原模板类的基础上 &#xff0c;针对特殊类型所进行特殊化的实现方式 。模板特化中分为函数模板特化 与 类模板特化 。 注意&#xff1a;以下示例均已日期类为例 class Date { public:Date(int year 1900…

Android ImageView如何使用.svg格式图片

我们知道imageview常用的图片格式是.jpg/.png或者drawable里的部分.xml文件。但有时UI会给过来.svg格式的文件&#xff0c;下面讲解如何使用.svg格式图片文件 step1:AS点击File -> New -> Vector Asset step2:选中要使用的.svg文件&#xff0c;按需要命名和调整&#x…

Unity相机跟随角色移动

相机跟随角色移动 使用LateUpdate()&#xff1b;方法&#xff0c;根据角色移动而进行跟随&#xff0c;固定角度&#xff0c;类似2.5D视角。 需要将相机放到一个空对象&#xff0c;将角度调节好&#xff0c;挂载组件&#xff0c;将角色对象放入组件中&#xff0c;调整moveTime设…

C++中pow函数功能是什么,如何使用?

在C中&#xff0c;pow函数的功能是计算一个数的幂。它接受两个参数&#xff0c;第一个参数是底数&#xff0c;第二个参数是指数。pow函数的定义如下&#xff1a; double pow(double base, double exponent);使用pow函数很简单&#xff0c;你只需要将底数和指数作为参数传递给函…

Mysql For Navicate (老韩)

Navicate创建数据库 先创建一个数据库;然后在数据库中创建一张表;在表格当中填入相应的属性字段;打开表, 然后填入相应的实例字段; – 使用数据库图形化App和使用指令来进行操作各有各的好处和利弊; 数据库的三层结构(破除MySQL神秘) 所谓安装Mysql数据库, 就是在主机安装一…

231227-9步在RHEL8.8配置本地yum源仓库

Seciton 1&#xff1a;参考视频 RHEL8配置本地yum源仓库-安徽迪浮_哔哩哔哩_bilibili Seciton 2&#xff1a;具体操作 &#x1f3af; 第1步&#xff1a;查看光驱文件/dev/sr0是否已经挂载&#xff1f;此处已挂在 [lgklocalhost ~]$ df -h &#x1f3af; 第1步&#xff1a;查看…

在处理金额时用long还是BigDecimal,所引发的讨论

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦&#xff01; 周末在闲逛的时候 无意间看到一个…

Vue3数据交互axios

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…