一.数组

  • 数组的定义:相同类型的数据集合
  • go语言中数组的索引从0开始
  • 没有赋值的数值型数组,默认值为0
  • 数组一旦被创建,它的大小就是不可改变的

(1)声明数组与打印

var 变量名 [大小]变量类型

 //数组的声明
var nums [4]int //数组的赋值
nums[0] = 1
nums[1] = 2
nums[2] = 3
nums[3] = 4 /***************数组的打印*************/
fmt.Printf("%T\n", nums) //打印数组的类型:[4]int
fmt.Println(nums[3]) //打印单个数组的值:4
fmt.Println("长度:", len(nums)) //打印数组的长度:4
fmt.Println("容量:", cap(nums)) //打印数组的容量:4

(2)数组的初始化

在go语言中,数组有多种初始化方式。

  • 常量初始化定义数组
  • 快速的定义数组
  • 定义不确定长度的数组
  • 给指定下标进行赋值操作
	//1、常量的初始化定义数组
var arrs1 = [5]int{1, 2, 3, 4, 5} //2、快速定义数组
arrs2 := [5]int{6, 7, 8, 9, 10} //3、定义不确定长度的数组
arrs3 := [...]string{"hello", "xuexiangban", "kuangshenshuo"} //4、给指定下标进行赋值操作
arrs4 := [5]int{1: 100, 3: 200}//给下标为1赋值为100,下标为3赋值为200

(3)数组的遍历

  • for循环遍历
	//1、for循环遍历数组
arr1 := [5]int{1, 2, 3, 4, 5} //创建数组
for i := 0; i < len(arr1); i++ {
fmt.Println(arr1[i])
}
/*输出结果:
1
2
3
4
5
*/
  • for-range遍历方式
	//2、forage循环遍历数组
for index, value := range arr1 { //index下标,value对应的值
fmt.Println(index, value)
}
/*输出结果:
0 1
1 2
2 3
3 4
4 5
*/

(4)数组是值传递类型

  • 在go语言中,数组被看作是值传递类型,因此数组之间可以直接相互赋值
	arr1 := [3]int{1, 2, 3}         //创建数组1:整型
arr2 := [2]string{"hello", "xuexiangban"} //创建数组2:字符型
arr3 := arr1 //创建数组3直接被赋值数组1
fmt.Println(arr1, arr3) //打印结果:[1 2 3] [1 2 3]
arr3 = [3]int{4, 5, 6} //重新赋值
fmt.Println(arr1, arr3) //[1 2 3] [4 5 6]

(5)多维数组

  • go语言支持多维数组,以下为常用的多维数组声明方式
var 变量名[SIZE1][SIZE2]...[SIZEN]变量类型
  • 多维数组定义示例:
	arr := [3][4]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
  • 多维数组使用示例
	//forage循环输出
for _, i := range arr {
fmt.Println(i) //打印外层
fmt.Println("=========") //打印内层
for _, i2 := range i {
fmt.Println(i2)
}
} /*打印结果:
[1 2 3 4]
=========
1
2
3
4
[5 6 7 8]
=========
5
6
7
8
[9 10 11 12]
=========
9
10
11
12 */

二.切片

Go语言切片是对数组的抽象

go语言数组的长度是不可改变的切片的长度是不固定的可以追加元素,在追加时可能使切片的容量增大

切片是一种方便、灵活且强大的包装器,切片本身没有任何数据,他们只是对现有数组的引用

切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由

(1)定义创建切片

切片与数组在定义时不同,可以不用指定长度容量

	//1、定义一个切片,里面不添加数据,打印输出
s1 := []int{}
fmt.Println(s1) //输出结果:[] //2、定义切片向里面添加数据,打印输出类型
s2 := []int{1, 2, 3}
fmt.Println(s2) //输出结果:[1 2 3]
fmt.Printf("%T", s2) //输出结果[]int

补充:长度(length)和容量(cap)区别

  • 长度(length)指切片中当前包含的元素个数。使用内置函数len()可以获取切片的长度。

  • 容量(capacity)指分配给切片的底层数组中可用于存储元素的空间大小。容量至少等于切片长度,但可能会更大以容纳未来的增长。使用内置函数cap()可以获取切片的容量。

  • 在创建切片的时候,可以只指定长度也可以同时指定长度和容量。当只指定长度时,切片的容量与长度相等。当同时指定长度和容量时,切片的容量可以大于长度。

(2)make函数创建切片

make函数创建切片,可以指定切片的长度和容量

make([]T,length,capactity)   //类型,长度,容量
  • 使用示例
	//1、通过make函数来创建切片
s1 := make([]int, 5, 10) //长度:5,容量为10
//2、给切片里面的元素进行赋值
s1[0] = 100
//3、打印输出长度,容量
fmt.Println(s1)
fmt.Println("长度:", len(s1))
fmt.Println("容量:", cap(s1))

(3)切片扩容append

  • 注意:追加数据超过容量后,容量只会2倍扩容地址会发生改变
	//1、创建一个切片s1
s1 := make([]int, 2, 4)
fmt.Println("追加数据前的长度和容量:", len(s1), cap(s1))
//2、s1通过append追加数据
s1 = append(s1, 1, 2, 3, 4) //追加数据,不是添加数据
fmt.Println(s1)
fmt.Println("追加数据后的长度和容量:", len(s1), cap(s1)) // 3、创建一个s2,将s2中数据追加到s1
s2 := make([]int, 3, 3)
s2 = []int{1, 2, 3}
s1 = append(s1, s2...) //将s2里面的数据追加到s1
fmt.Println(s1)

(4)在已有数组上创建切片

从已有的数组上,直接创建切片,该切片的底层数组就是当前的数组,长度是从start到end切到的数据量,但是容量从start到数组的末尾。

从数组上创建的切片,地址与数组是一样的,因此修改数组或切片的某个值,对应的数组/切片的值也会改变

slice := arr[start:end]

	//定义数组和其切片
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} s1 := arr[:5] //切片从1-5 [1 2 3 4 5]
s2 := arr[4:8] //[5 6 7 8]
s3 := arr[5:] //[6 7 8 9 10]
s4 := arr[:] //[1 2 3 4 5 6 7 8 9 10]
fmt.Println(s1) //[1 2 3 4 5]
fmt.Println(s2) //[5 6 7 8]
fmt.Println(s3) //[6 7 8 9 10]
fmt.Println(s4) //[1 2 3 4 5 6 7 8 9 10] //修改数组的某个值
arr[0] = 100 //将数组元素值进行更换
fmt.Println(arr) //[100 2 3 4 5 6 7 8 9 10]
fmt.Println(s1) //[100 2 3 4 5 6 7 8 9 10] //修改切片的某个值
s1[1] = 100
fmt.Println(arr) //[100 100 3 4 5 6 7 8 9 10]
fmt.Println(s1) //[100 100 3 4 5] //查看数组和对应切片的地址
fmt.Printf("%p\n", s1) //0xc0000ac0f0
fmt.Printf("%p\n", &arr) //0xc0000ac0f0

(5)切片是引用类型

  • 与数组不同,数组是值传递类型,而切片是引用类型
  • 数组之间可以直接赋值,改变其中一个数组的值,另一个数组的值不会发生改变
  • 切片之间若直接赋值,则改变其中一个切片的值,另一个切片的值同样发生改变
	s1 := []int{1, 2, 3, 4, 5}
s2 := s1
s2[0] = 100
fmt.Println(s1, s2) //切片2里元素发生变化,切片1也会跟随着变化
fmt.Printf("%p\t%p", s1, s2) //说明切片的copy指向的是地址

(6)copy深拷贝与浅拷贝

  • 深拷贝:拷贝的是数据本身
  • 浅拷贝:拷贝的是数据的地址,会导致多个变量指向同一块内存
  • 引用类型的数据,默认都是浅拷贝,如切片,集合
  • 可以用copy强制实现深拷贝

实现切片的深拷贝

	//1、通过for循环实现切片的深拷贝
s1 := []int{1, 2, 3, 4}
s2 := make([]int, 0, 0)
for i := 0; i < len(s1); i++ {
s2 = append(s2, s1[i])
}
fmt.Println(s1, s2)
//2、通过copy操作实现深拷贝
s3 := []int{5, 6, 7, 8}
fmt.Println(s1, s3)
copy(s3, s1) //(接收者,传递者) 将s1 copy 给s3
fmt.Println(s1, s3)

Go语言数组与切片学习总结的更多相关文章

  1. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  2. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  3. Go语言--数组、切片、

    3.1 数组--固定大小的连续空间 3.1.1 声明数组 写法 var 数组变量名 [元素数量]T 说明: 变量名就是使用时的变量 元素的数量可以是表达式,最后必须为整型数值 T 可是是任意基本类型, ...

  4. 第四章 go语言 数组、切片和映射

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 数组是由同构的元素组成.结构体是由异构的元素组成.数据和结构体都是有固定内存大小的数 ...

  5. go语言数组与切片比较

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, . ...

  6. C语言-数组的深入学习

    深入学习一下数组1.从内存角度来讲:数组变量就是一次分配多个变量,而且这些变量的地址是连续的,也就是存放这些变量的存储单元是依次相连接的.而且这多个变量必须单独访问,不可以一起访问的.因为他们的地址彼 ...

  7. GO语言数组,切片,MAP总结

    数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 数组的长度必须是常量,并且长度是数组类型的一部分.一旦定义,长度不能变.数 ...

  8. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

  9. go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  10. 学习Golang语言(6):类型--切片

    学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...

随机推荐

  1. .NET Core多线 (5) 常见性能问题

    合集:.NET Core多线程温故知新 .NET Core多线程(1)Thread与Task .NET Core多线程(2)异步 - 上 .NET Core多线程(3)异步 - 下 .NET Core ...

  2. 轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2

    Llama 2 是 Meta 的下一代开源大语言模型.它是一系列经过预训练和微调的模型,参数范围从 70 亿到 700 亿个.Meta Llama 2 可免费用于研究和商业用途并且提供了一系列具有不同 ...

  3. AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通

    本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...

  4. 如何调用API接口获取淘宝商品数据

    淘宝商品数据的获取是一项非常重要的技术,它可以为淘宝卖家和买家提供有利的数据分析和扩展市场的机会.调用API接口是一种快速.方便.高效的方式获取淘宝商品数据. 以下是一些步骤来调用API接口来获取淘宝 ...

  5. LSTM推导

    LSTM推导 forward propagation def lstm_cell_forward(xt, a_prev, c_prev, parameters): """ ...

  6. python一键过杀软

    python过杀软新 利用python加载shellcode过360.火绒等杀软 先上代码 将以下代码保存到 mt.py import base64 import os import shutil b ...

  7. 关于初次new springboot项目

    如果是新手初学,然后做springboot项目报各种错,改来改去最终都无法出现successful字样. 请先检查,maven环境是否配好. maven环境决定你下载依赖的速度,以及能否下载成功. m ...

  8. 数据泵(impdb)导入Oracle分片的数据库dump文件

    数据泵(impdb)导入Oracle数据库 一.sqlplus登录目标数据库,创建导入的目录路径 #该目录要在导入的数据库本机建立,如果是docker就在容器内部创建 create directory ...

  9. MySQL系列之——索引作用、索引的种类、B树、聚簇索引构建B树、辅助索引(S)构建B+树、辅助索引细分、索引树的高度、索引的基本管理、执行计划获取及分析、索引应用规范、优化器针对索引、问题汇总

    文章目录 一 索引作用 二 索引的种类(算法) 三 B树 基于不同的查找算法分类介绍 B 树 B+树 B*树 四 在功能上的分类 4.1 聚簇索引构建B树(簇就是区) 4.1.1 前提 4.1.2 作 ...

  10. Webpack DevServer 代理本地静态目录

    前言 项目里需要离线切片地图,但切片地图文件很多,需求上有时无法单独提供一个独立的文件服务器或者切片服务器,放在 public 难免会在调试运行时被复制到 DevServer 上,而这个操作在低层级少 ...