首页 > 其他分享 >golang数组&切片&map

golang数组&切片&map

时间:2024-02-20 15:03:47浏览次数:20  
标签:map int fmt golang var arr1 Println 切片

数组image-20240219225149580

数组声明
func main() {

	/* 语法一 */
  // 数组名字 [数组长度] 数组类型
	// 声明一个数组 长度为3 类型是int 会初始化为int类型的零值,默认值是[0 0 0 ]
	// 声明数组的时候指定长度是一个常量,数组的不可改变,超出长度会报错
	var arr [3]int
	// 数组赋值
	arr[0] = 1
	arr[1] = 2
	fmt.Println(arr) // [1 2 0]

	/* 语法二 声明数组同时赋值, 指定的长度为4,指定值初始化数组,默认为「1 2 0 0】*/
	var arr2 = [4]int{1, 2}
	fmt.Println(arr2)
	// 字符串数组默认初始化值为空
	var arr3 = [3]string{"li", "li"}
	fmt.Println(arr3) // [li li ]

	/* 语法三  根据初始值的个数推断数组的长度*/
	var arr5 = [...]string{"1", "2", "3"}

	fmt.Println(arr5)

	/* 语法四 通过索引值初始化数组  通过索引:对应值初始化数组,长度为最大索引*/
	arr6 := [...]int{0: 1, 3: 4, 8: 9}
	fmt.Println(arr6) // [1 0 0 4 0 0 0 0 9]

}

数组循环遍历
func main() {

	arr6 := [...]int{0: 1, 3: 4, 8: 9}
	fmt.Println(arr6) 
	// 通过遍历索引
	for i := 0; i < len(arr6); i++ {
		fmt.Println(arr6[i])
	}
	
	// 使用 range
	for _, v := range arr6 {
		fmt.Println(v)
	}
}

值类型和引用类型

基本数据类型和数组都属于值类型

func main() {
	// 定义数组
	var arr = [3]int{1, 2, 3}
	// 值类型:赋值和传参赋值整个数组,改变变量副本的值的时候,不会改变本身的值
	arr2 := arr
	arr2[0] = 333
	fmt.Println(arr)  // [1 2 3]
	fmt.Println(arr2) // [333 2 3]

	// 定义切片
	var i = []int{1, 2, 3}
	// 引用类型:副本和原数据指向同一个内存地址,、改变变量副本的值的时候,会改变本身的值
	j := i
	j[0] = 333
	fmt.Println(i) //  [333 2 3]
	fmt.Println(j) //  [333 2 3]

} 
多维数组

多维数组可以理解为在数组中嵌套数组

func main() {
	// 一维数组
	var arr1 = [3]int{1, 2, 3}
	fmt.Println(arr1)

	// 二维数组 指定长度
	var arr2 = [3][2]string{{"北京", "上海"}, {"1", "2"}, {"3", "4"}}
	fmt.Println(arr2) // [[北京 上海] [1 2] [3 4]]
  
  // 二维数组 让编译器通过数量推导长度, 只有第一层可以使用... 后面不可以
	var arr3 = [...][2]int{{1,2},{3,4}}
	fmt.Println(arr3)

	// 在二维基础上可以继续N维,取值就是通过下标取出一维再继续下标取值

	// 迭代二维数组
	for _, v1 := range arr2 {
		for _, v2 := range v1 {
			fmt.Println(v2)
		}

	}
}

切片

image-20240220105529276

初始化数组
	/* 语法一 */
	// 声明切片
	// 切片变量名 []切片类型,[]里面指定长度是数组,不指定是切片
	var arr []int
	fmt.Println(arr)        // []
	fmt.Println(arr == nil) //true go中声明的变量 但是变量没有赋值的时候,会给变量赋值一个默认零值,nil

	/* 语法二 */
	// 初始化切片时赋值
	var arr1 = []int{1, 2, 3, 4, 5, 6}
	fmt.Println(arr1) // [1 2 3 4 5 6]

	/* 语法三 通过索引赋值 长度是最大索引,没有指定值的索引默认值为0 */
	var arr2 = []int{1: 3, 7: 1}
	fmt.Println(arr2) // [0 3 0 0 0 0 0 1]

基于数组定义切片
 // 获取数组里面的所有值
	var arr3 = [6]int{1, 2, 3, 4, 5, 6}
	var arr4 = arr3[:]
	fmt.Println(arr4) // [1 2 3 4 5 6]

	// 获取数组里面 从下标1开始 到下标4结束,包头不包尾
	var arr5 = arr3[1:4]
	fmt.Println(arr5) // [2 3 4]

	// 获取数组里面 从下标2开始到结束的所有值
	var arr6 = arr3[2:]
	fmt.Println(arr6) // [3 4 5 6]

	// 获取数组里面 从下标0开始开始到下标3前所有值
	var arr7 = arr3[:3]
	fmt.Println(arr7) // [1 2 3]

基于切片定义切片
	// 下标1开始的所有数据,逻辑与基于数组定义切片一致
  var arr8 = []int{1, 2, 3}
	fmt.Println(arr8[1:]) // [2 3]
切片的长度和容量

image-20240220112045586

func main() {

	var arr = []int{1, 2, 3, 4, 5, 6, 7, 8}
	fmt.Println(len(arr), cap(arr))         // 长度8  容量8
	fmt.Println(len(arr[2:]), cap(arr[2:])) // 长度6 容量6

	/*
		长度是2  容量是7
		长度就是元素的个数 1:3 是2和3
		容量是从第一个元素开始,即从2开始,到底层数组(arr)元素末尾的个数,即从2到8,是对应的容量
	*/

	fmt.Println(len(arr[1:3]), cap(arr[1:3])) // 长度2 容量7

}

image-20240220113440861

通过make方法构造切片
func main() {
	// Param: 切片类型、切片长度、切片容量
	var arr = make([]int, 4, 8)
	fmt.Println(arr)      // [0 0 0 0] 默认值都是0
	fmt.Println(len(arr)) // 4
	fmt.Println(cap(arr)) // 8
	
	
	var arr1 []int
	fmt.Println(arr1)      // []
	fmt.Println(len(arr1)) // 0
	fmt.Println(cap(arr1)) // 0

}

append

切片扩容:

func main() {

	// 不能使用下标给切片扩容,使用append动态扩容
	var arr1 []int
	fmt.Println(arr1)      // []
	fmt.Println(len(arr1)) // 0
	fmt.Println(cap(arr1)) // 0

	// Param:要扩容的切片,要添加的元素
	arr1 = append(arr1, 1)
	fmt.Println(arr1)      // [1]
	fmt.Println(len(arr1)) // 1
	fmt.Println(cap(arr1)) // 1

	// 批量扩容
	arr1 = append(arr1, 2, 3, 4, 5)
	fmt.Println(arr1)      // [1 2 3 4 5]
	fmt.Println(len(arr1)) // 5
	fmt.Println(cap(arr1)) // 6 

}

image-20240220115801023

合并切片:

func main() {

	arr1 := []int{1, 2, 3}
	arr2 := []int{4, 5, 6}
	// 将arr1切片的内容合并到arr2中,被合并的切片名后要加...
	arr2 = append(arr2, arr1...)
	fmt.Println(arr2) // [4 5 6 1 2 3]

}

copy

copy引用类型后修改副本变量,不影响原变量的值

func main() {
	// 切片是引用数据类型
	arr1 := []int{1, 2, 3}
	arr2 := make([]int, 3, 4)
	// 使用copy 将arr1的值复制到arr2
	copy(arr2, arr1)
	fmt.Println(arr1) // [1 2 3]
	fmt.Println(arr2) // [1 2 3]

	// 修改arr2值,没有影响arr1,
	arr2[0] = 333
	fmt.Println(arr1) // [1 2 3]
	fmt.Println(arr2) // [333 2 3]
}
切片删除元素
func main() {
	// golang中没有直接提供对应的方法删除元素,可以使用切片本身的特性删除元素

	// 使用append合并删除下标为2的元素
	arr1 := []int{1, 2, 3, 4, 5}
	arr1 = append(arr1[:2], arr1[3:]...)
	fmt.Println(arr1)

}
切片排序

选择排序和冒泡排序:

func main() {
	/*
		通过比较 先选出最小的数放在第一个位置后,然后依次小的数往后放
	*/
	var numSlice = []int{10, 8, 6, 5, 4}
	for i := 0; i < len(numSlice); i++ {
		for j := i + 1; j < len(numSlice); j++ {

			if numSlice[i] > numSlice[j] {
				temp := numSlice[i]
				numSlice[i] = numSlice[j]
				numSlice[j] = temp
			}

		}

	}
	fmt.Println(numSlice) // [4 5 6 8 10]

	/*
	  冒泡排序:从头到尾,比较相邻的两个元素的大小,如果符合交互条件,交换两个元素的位置
	  每一轮比较都会选出一个最大的书放在正确的位置

	*/

	var numberSlice = []int{8, 3, 9, 4, 5}
	for i := 0; i < len(numberSlice); i++ {

		for j := 0; j < len(numberSlice)-1-i; j++ {
			if numberSlice[j] > numberSlice[j+1] {
				temp := numberSlice[j]
				numberSlice[j] = numberSlice[j+1]
				numberSlice[j+1] = temp

			}

		}

	}
	fmt.Println(numberSlice)

}

sort包:

sort升序排序:

	var intList = []int{11, 21, 3, 45, 5, 6}
	var strList = []string{"z", "a", "d", "h", "g"}
	var floatList = []float64{3.14, 2.12, 5.3, 9.9, 8.8}
	// sort 升序排序
	sort.Ints(intList)
	sort.Strings(strList)
	sort.Float64s(floatList)

sort降序排序:

	var intList = []int{11, 21, 3, 45, 5, 6}
	var strList = []string{"z", "a", "d", "h", "g"}
	var floatList = []float64{3.14, 2.12, 5.3, 9.9, 8.8}
	// sort 降序排序

	sort.Sort(sort.Reverse(sort.IntSlice(intList)))
	sort.Sort(sort.Reverse(sort.Float64Slice(floatList)))
	sort.Sort(sort.Reverse(sort.StringSlice(strList)))

map

map是无须的基于key-value的数据结构,map是引用类型,必须初始化才能使用

初始化map:
	/* 语法一  通过make创建map */
	// Param: map[key的类型]value的类型,10是分配的初始容量,可传可不传
	// 指定初始容量的目的是为了在创建 map 时,预先分配一定的内存空间,以减少后续插入键值对时的内存重新分配次数。这可以提高性能,特别是在大规模的 map 中
	// 初始容量并不限制 map 存储的键值对数量,它只是一个指示性的值,map 会根据实际的键值对数量自动调整内部存储空间
	var user = make(map[string]string, 10)
	user["name"] = "lq"
	fmt.Println(user)

	/* 语法二 */
	var userInfo = map[string]string{
		"name": "l",
		"age":  "2",
		"sex":  "nan", // 最后复制的数据必须要加,
	}
	fmt.Println(userInfo)
查找某个key是否存在:
	var userInfo = map[string]string{
		"name": "l",
		"age":  "2",
		"sex":  "nan", // 最后复制的数据必须要加,
	}
	fmt.Println(userInfo)
	// 查找某个key是否存在,两个变量接受,第一个是value,第二个是是否存在,存在是true,不存在是false
	// 如果查找的不存在,value则是对应数据的默认值,int是0,str是空
	value, status := userInfo["name"]
	fmt.Println(value, status) // l  true
删除键值对
	var userInfo = map[string]string{
		"name": "l",
		"age":  "2",
		"sex":  "nan",
	}
	fmt.Println(userInfo) // map[age:2 name:l sex:nan]
	// delete方法删除map指定的key
	// Param: map,要删除的key
	delete(userInfo, "age")
	fmt.Println(userInfo) // map[name:l sex:nan]
元素为map类型的切片
func main() {
	// 定义切片 类型是map
	var userinfo = make([]map[string]string, 1, 1)
	fmt.Println(userinfo) // [map[]]

	// map的默认值是nil
	if userinfo[0] == nil {
		// map必须初始化后才可以使用
		userinfo[0] = make(map[string]string)
		userinfo[0]["name"] = "1"
		userinfo[0]["age"] = "1"

	}
	fmt.Println(userinfo) // [map[age:1 name:1]]

}
值为切片类型的map
	// 定义值为切片的map
	var userinfo = make(map[string][]string)
	// 赋值:初始化切片赋值
	userinfo["like"] = []string{"1", "2", "3"}

标签:map,int,fmt,golang,var,arr1,Println,切片
From: https://www.cnblogs.com/Mickey-7/p/18023120

相关文章

  • 最新Nmap入门技术
    Nmap详解Nmap(NetworkMapper,网络映射器)是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫描大型网络,包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别、WAF识别及常见的安全漏洞。它的图形化界面是Zenmap,分布式框架为DNmap。 Nmap的特点如下。(1......
  • 通用方式实现Map
    通用方式实现MapChatGpt实现展示地图并在地图上提供操作选项的技术栈可以包括:Web开发技术:HTML、CSS、JavaScript地图API:如GoogleMapsAPI、MapboxAPI、Leaflet等前端框架:如React、Vue.js、Angular等后端技术:如Node.js、Django、Flask等(如果需要与后端交互)数据库:如MySQL......
  • golang运算符&流程控制
    运算符算数运算funcmain(){ varaint=10 varbint=8 varc=3.14 vard=5.15 fmt.Println(a+b)//18 fmt.Println(a-b)//2 fmt.Println(a*b)//80 fmt.Println(a/b)//1,Go中,如果运算的都是整数,相除后会默认去掉小数,保留整数部分, fmt.Pr......
  • Map判空 、空字符串、空key值等各种判断方法
    一、Map本身的判空1.1“==null”不能判断Map的本身是否为null  1.2map.isEmpty()判断为空当map没有向里面put数据的时候,可以利用map自带得方法来进行判断该Map是否里面有值 1.3“==null”与“isEmpty()”最大的区别如果map是一个null存在,那么在利用isEmpty()来判空将......
  • 如何通过矢量数据生成矢量瓦片(矢量切片)?
    ​   通过以下方法可以将矢量数据生成矢量瓦片。 方法/步骤下载三维地图浏览器http://www.geosaas.com/download/map3dbrowser.exe,安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“3、点击“矢量瓦片”下拉菜单,然后点击......
  • golang基本数据类型
    数据类型介绍Go语言中的数据类型分为:基本数据类型和复合数据类型基本数据类型:整型、浮点型、布尔型、字符串复合数据类型:数组、切片、结构体、函数、map、通道(channel)、接口等基本数据类型:整型整型分为两个大类:有符号整型按长度分为:int8、int16、int32、int6......
  • 解决MyBatis Mapper 的XML文件SQL语句无法自动提示问题
    一、问题1.问题场景IDEA中MyBatis编写mapper的SQL语句的时候无法提示SQL和数据库2.问题描述无法正常方便的使用IDEA的提示功能,更准确无误的编写代码3.本解决方案优势亲测可用,一劳永逸(IDEA版本IntelliJIDEA2021.1.3 )目的在于对Mybatis的Mapper.XML中sql语句进行提示......
  • mapPartition与map函数
    dd的mapPartitions是map的一个变种,它们都可进行分区的并行处理。两者的主要区别是调用的粒度不一样:map的输入变换函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区。Map算子是分区内一个数据一个数据的执行,类似于串行操作。而mapPartitions算子是以分区为......
  • 03 进阶篇-高阶数据类型BitMaps、HyperLogLogs
    BitMaps介绍BitMaps的基本概念,它是一种通过位来表示数据的方法,能高效地处理大量布尔值。展示BitMaps在用户在线状态、统计等方面的应用示例。介绍相关的命令,如SETBIT,GETBIT,BITCOUNT,BITOP等。BitMaps的基本概念BitMaps,或称为位图,是Redis中用于高效处理大量布尔值的......
  • 唯一客服系统:Golang开发客服系统源码,支持网页,H5,APP,微信小程序公众号等接入,商家有PC端
    本系统采用GolangGin框架+GORM+MySQL+Vue+ElementUI开发的独立高性能在线客服系统。客服系统访客端支持PC端、移动端、小程序、公众号中接入客服,利用超链接、网页内嵌、二维码、定制对接等方式让网上所有通道都可以快速通过本系统联系到商家。 服务端可编译为二进制程序包,无......