【go从零单排】go中的三种数据类型array、slices、maps

挪威特罗姆瑟夜景

Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

array数组

package mainimport "fmt"func main() {var a [5]int //var关键字定义数组,[5]表示长度,int表示元素类型,不赋值时默认每个元素都是0fmt.Println("emp:", a)a[4] = 100 //给下标为4的元素(即第五个元素)赋值为100fmt.Println("set:", a)fmt.Println("get:", a[4])fmt.Println("len:", len(a))b := [5]int{1, 2, 3, 4, 5} //用:=自动判断b的类型,省略了var关键字,{}大括号给数组赋值fmt.Println("dcl:", b)b = [...]int{1, 2, 3, 4, 5} //和上面的区别是...不指定数组的长度,编译器会自动根据赋值的个数判断数组长度,并可以改变fmt.Println("dcl:", b)//使用3:400 这样的方式赋值时,中间的元素默认为0b = [...]int{100, 3: 400, 500} //3:400 是一种特殊的赋值方法,表示下标为3的元素赋值为400,500是下标为4的元素,b的长度是5fmt.Println("idx:", b)var twoD [2][3]int //二维数组,2行3列,记忆方法先横后竖for i := 0; i < 2; i++ {for j := 0; j < 3; j++ {twoD[i][j] = i + j}}fmt.Println("2d: ", twoD)twoD = [2][3]int{ //直接手写二维数组{1, 2, 3},{1, 2, 3},}fmt.Println("2d: ", twoD)
}

输出:

go run post.go
emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
dcl: [1 2 3 4 5]
dcl: [1 2 3 4 5]
idx: [100 0 0 400 500]
2d:  [[0 1 2] [1 2 3]]
2d:  [[1 2 3] [1 2 3]]

总结:

  • 这里注意二维数组的输出,[ [ …] [… ] ]都是中括号
  • 数组的数据类型必须相同 数组创建时制定长度,然后不可变
  • 数组创建时不指定长度,编译器自动判断长度

slices

Slices are an important data type in Go, giving a more powerful
interface to sequences than arrays.
slices 切片(翻译成中文有点怪怪的)是一种比array有更强大接口的序列。

package mainimport ("fmt""slices"
)func main() {var s []string //var关键字定义s变量,用[]表示slice,string表示元素类型为字符串//nil是空值的意思 ,len(s)表示s的长度fmt.Println("uninit:", s, s == nil, len(s) == 0) //打印出uninit这个变量,==表示判断,结果是true或falses = make([]string, 3) //用make初始化一个slice初始值为零或空initially zero-valued,指定长度为3,容量默认和长度一样fmt.Println("emp:", s, "len:", len(s), "cap:", cap(s))//用下标给slice赋值,类似arrays[0] = "a"s[1] = "b"s[2] = "c"fmt.Println("set:", s)fmt.Println("get:", s[2])fmt.Println("len:", len(s))//用append方法增加值到slice中,要赋值给一个变量s = append(s, "d")s = append(s, "e", "f")fmt.Println("apd:", s)//copy复制slicec := make([]string, len(s))copy(c, s) //注意copy的用法(新变量,被复制的变量),记忆:喜新厌旧,新的变量在前fmt.Println("cpy:", c)//slice的切片操作,类似python切片,前开后闭l := s[2:5]fmt.Println("sl1:", l)l = s[:5] //冒号前省略表示从第一个元素开始fmt.Println("sl2:", l)l = s[2:] //冒号后省略表示截取到最后一个元素fmt.Println("sl3:", l)//直接给slice赋值t := []string{"g", "h", "i"}fmt.Println("dcl:", t)t2 := []string{"g", "h", "i"}//slice.Equal比较是slice的值否相等if slices.Equal(t, t2) {fmt.Println("t == t2")}//二维切片twoD := make([][]int, 3) //创建了一个外部切片 twoD,其长度为3。这个外部切片将包含三个内部切片。for i := 0; i < 3; i++ { //外循环,循环外部切片innerLen := i + 1twoD[i] = make([]int, innerLen) //为外部切片中的每个位置创建一个内部切片,内部切片的长度由 innerLen 决定 1,2,3。for j := 0; j < innerLen; j++ { //内循环,循环内部切片twoD[i][j] = i + j //将值 i + j 赋给内部切片中的每个位置,这里的 i 表示外部切片的索引,j 表示内部切片的索引。}}fmt.Println("2d: ", twoD)
}

输出:

go run post.go
uninit: [] true true
emp: [  ] len: 3 cap: 3
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
t == t2
2d:  [[0] [1 2] [2 3 4]]

对比array:

  • slice比array的接口要更多,Equal,copy等方法
  • 二维slice的创建需要多熟悉
  • slice是一种引用结构,是指向一个底层array
  • array在创建时就固定了类型和长度[5]int 和[10]int是两种类型
  • slice的长度可变,array长度不可变
  • array常用于处理固定长度的数据,slice处理可变长度的数据

map

package mainimport ("fmt""maps"
)func main() {//关键字make(map)构造map,string为key类型,int为value类型m := make(map[string]int)//赋值m["k1"] = 7m["k2"] = 13fmt.Println("map:", m)v1 := m["k1"]fmt.Println("v1:", v1)v3 := m["k3"] //当value不存在时,默认是0fmt.Println("v3:", v3)fmt.Println("len:", len(m))//delete删除keydelete(m, "k2")fmt.Println("map:", m)//clear清空mapclear(m)fmt.Println("map:", m)//从map中获取的第二个参数可以返回该key是否存在于map中,这里我们只想知道是否存在,而不需要具体的值,用空符号“_”占位_, prs := m["k2"]fmt.Println("prs:", prs)//直接声明map并赋值n := map[string]int{"foo": 1, "bar": 2}fmt.Println("map:", n)n2 := map[string]int{"foo": 1, "bar": 2}//对比两个map的值是否相等if maps.Equal(n, n2) {fmt.Println("n == n2")}
}

输出:

go run post.go
map: map[k1:7 k2:13]
v1: 7
v3: 0
len: 2
map: map[k1:7]
map: map[]
prs: false
map: map[bar:2 foo:1]
n == n2

总结:

  • map类似python中的dict map中有第二个返回参数,可以知道该key是否存在于map
  • map中key不存在时默认返回0值
  • delete移除一个元素、clear清空ma跑、Equal对比是否相等
  • Println打印时以[k:v k:v] 的样式展示

掌握知识的最好方式就是教会别人,每篇文章都讲清楚一个知识点,欢迎留言我一起讨论。

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

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

相关文章

科技改变阅读习惯:最新研究揭示电子阅读器的普及趋势

据QYResearch调研团队最新报告“全球电子阅读器市场报告2023-2029”显示&#xff0c;预计2029年全球电子阅读器市场规模将达到6.9亿美元&#xff0c;未来几年年复合增长率CAGR为0.4%。 如上图表/数据&#xff0c;摘自QYResearch最新报告“全球电子阅读器市场研究报告2023-2029.…

解决 VSCode 中 C/C++ 编码乱码问题的两种方法

解决 VSCode 中 C/C 编码乱码问题的两种方法 在中国地区&#xff0c;Windows 系统中的 cmd 和 PowerShell 默认编码是 GBK&#xff0c;但 VSCode 默认使用 UTF-8 编码。这种编码不一致会导致在 VSCode 终端中运行 C/C 程序时出现乱码。以下介绍两种方法来解决这一问题。 方法…

UE5遇到问题记录

问题描述&#xff1a; 在让敌人自动追踪玩家的时候一开始运行就会播放攻击的动画 解决方法&#xff1a; 这样是因为敌人一开始就检测到自己了&#xff0c;所以触发动画。 方式一&#xff1a;加一个条件 方式二&#xff1a;改一下碰撞预设

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点&#xff1a; 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集&#xff1a; 在攻防演练中&#xff0c;当完成边界突破后进入内…

基于Matlab 疲劳驾驶检测

Matlab 疲劳驾驶检测 课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI&#xff0c;通过输入视频&#xff0c;分帧&#xff0c;定位眼睛和嘴巴&#xff0c;通过眼睛和嘴巴的张合度&#xff0c;来判别是否疲劳。 二、操作步骤 第一步&#xff1a;最…

11.11 代码块

一 java 1.代码块 1&#xff09; 理解 使用构造器时&#xff1a;先默认 调用代码块内容 再调用 构造器内容【代码块 > 构造器】 1.1 细节 1&#xff09;静态代码块 只能加载一次 2&#xff09;先调用父类代码块 再子类代码块 3&#xff09;静态代码块是随着类加载而执行…

在gitlab,把新分支替换成master分支

1、备份master分支&#xff0c;可以打tag 2、删除master分支 正常情况下&#xff0c;master分支不允许删除&#xff0c;需要做两个操作才能删除 a、变更项目默认分支为非master分支&#xff0c;可以先随便选择 b、取消master为非保护分支 操作了上述两步&#xff0c;就可以删…

在使用element中的抽屉<el-drawer>页签<el-tabs/>组合时,echarts图表宽度显示异常问题

类似这种情况&#xff0c;宽度异常 原因&#xff1a;在展示出抽屉时&#xff0c;图表的组件一件初始化了&#xff0c;导致他的宽度提前设定好了&#xff08;我默认的style"width: 100%; height: 300px;"&#xff09;&#xff0c;我得解决方法有2个&#xff1a; 1、第…

《大模型应用开发极简入门》笔记

推荐序 可略过不看。 初识GPT-4和ChatGPT LLM概述 NLP的目标是让计算机能够处理自然语言文本&#xff0c;涉及诸多任务&#xff1a; 文本分类&#xff1a;将输入文本归为预定义的类别。自动翻译&#xff1a;将文本从一种语言自动翻译成另一种语言&#xff0c;包括程序语言。…

Unicode字符集(万国码)

1.三种编码方式&#xff1a; UTF-16&#xff1a;16个bit位&#xff08;2个字节&#xff09;存储 UTF-32&#xff1a;32个bit位&#xff08;4个字节&#xff09;存储 UTF-8&#xff1a;可变长度字符编码。1-4个字节存储&#xff0c;只需记住&#xff1a;英文字母1个字节表示&…

支持 Win10 的网络环境模拟(丢包,延迟,带宽)

升级 Windows 10 以后&#xff0c;原来各种网络模拟软件都挂掉了&#xff0c;目前能用的就是只有 clumsy&#xff1a; 唯一问题是不支持模拟带宽&#xff0c;那么平时要模拟一些糟糕的网络情况的话&#xff0c;是不太方便的&#xff0c;而开虚拟机用 Linux tc 或者设置个远程 l…

【Homework】【5】Learning resources for DQ Robotics in MATLAB

Lesson 5 代码-TwoDofPlanarRobot.m 表示一个 2 自由度平面机器人。该类包含构造函数、计算正向运动学模型的函数、计算平移雅可比矩阵的函数&#xff0c;以及在二维空间中绘制机器人的函数。 classdef TwoDofPlanarRobot%TwoDofPlanarRobot - 表示一个 2 自由度平面机器人类…

在模方置平建筑失败的原因是什么?

在模方置平建筑失败的原因是什么&#xff1f; 可能是obj拓扑不连续&#xff0c;可以在网格大师使用osgb转obj功能&#xff0c;选择拓扑或者重建。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c…

【大咖云集 | IEEE计算智能学会广州分会支持】第四届信息技术与当代体育国际学术会议(TCS 2024,12月13-15日)

第四届信息技术与当代体育国际学术会议&#xff08;TCS 2024&#xff09; 2024 4th International Conference on Information Technology and Contemporary Sports 重要信息 会议官网&#xff1a;www.icitcs.net&#xff08;会议关键词&#xff1a;TCS 2024&#xff09; 202…

常用机器人算法原理介绍

一、引言 随着科技的不断发展&#xff0c;机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心&#xff0c;它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理&#xff0c;包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

Cynet:全方位一体化安全防护工具

前言 1999年&#xff0c;布鲁斯施奈尔曾说过&#xff1a;“复杂性是安全最大的敌人。”彼时还是19年前&#xff0c;而现在&#xff0c;网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件&#xff0c;看似具有相当强的防护能力。 根据Cynet的描…

dolphin 配置data 从文件导入hive 实践(一)

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…

Redis如何保证数据不丢失(可靠性)

本文主要以学习为主&#xff0c;详细参考&#xff1a;微信公众平台 Redis 保证数据不丢失的主要手段有两个&#xff1a; 持久化 多机部署 我们分别来看它们两的具体实现细节。 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中&#xff08;如硬盘&#xf…

Linux数据管理初探

Linux数据管理初探 导语内存管理内存分配内存错用和处理 文件锁定锁文件/区域锁读写和竞争锁命令和死锁 dbm数据库例程dbm访问函数其他dbm函数 总结参考文献 导语 Linux为应用程序提供简洁的视图用来反映可直接寻址的内存空间&#xff08;但实际上可能是内存外存&#xff09;&…

Python中4个高效小技巧

分享 4 个省时的 Python 技巧&#xff0c;可以节省 10~20% 的 Python 执行时间。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【[点击这里]】&#xff01; 反转列表 Python 中通常有两种反转列表的方法&#xff1a;切片或 reverse() 函数调用。这两种方法都…