Go语言中数组、切片、Map知识点分享

数组、切片、Map知识点分享

一、数组

1、定义: var 数组名 [数组大小] 数组类型 eg:var arr [11]int (定于一个名字为arr的整型数组大小为11)
2、赋值:以arr为例,arr[0]=1;
3、数组的内存布局
&arr可以获得arr的数组地址,数组中第一个元素的地址就是数组的地址,之后的数组地址根据数组的类型决定,比如假如是int32类型数组,第二个元素地址递增4个字节。
顺便说一下类型所占字节数(参考https://blog.csdn.net/lucky404/article/details/103717224)

int8: 8位,就是一个字节
int16: 2个字节
int32: 4个字节
int64:8个字节)
float32: 4个字节
float64: 8 个字节
string
英文的ascii的string 1个英文字符或英文标点占1byte
中文的string 一个文字占用 3 byte
bool: 占用1byte

内存分析图:
在这里插入图片描述
如上图所示,定义了一个int32的整形数组(int64的所占字节大小是8个字节),可以由图看出intArr[0]的地址是0XC04204A0A0(第一个元素的地址也是数组的地址),所以第二个元素的地址是首地址+8(字节大小,以16进制运算),所以第二个元素的地址是0XC04204A0A8,同理可以推出后面元素的地址。
4、数组的注意事项
1)类型:值类型,只能进行值拷贝,如果想在其他函数中改变数组,需要使用引用传递(指针)
2)Go语言中数组具有默认值,int类型是0,string 是"",Bool是false

二、切片

1、定义:var 切片名字 [] 切片类型 eg:var slice []int 定义一个整型切片
2、类型:切片是引用类型,所以切片是引用传递
在这里插入图片描述
如图所示,切片本质上是一个Struct结构体,第一个元素储存地址,第二个储存长度,第三个储存容量

type  slice  struct {
    ptr *[2]int
    len int
    cap int
}

3、切片的使用
1)由于切片是引用类型,需要自己分配内存,所以需要make来创建切片;

var 切片名 [] 切片类型 =make([]切片类型,len,cap)  //如果分配了cap一定比len大
var slice []int=make ([]int,4,5)  //定义一个切片并且分配内存

2)使用数组直接赋值时候,var slice =arr[startIndex,endIndex]不包含endIndex;
3)切片可以继续切片,eg:slice:=slice[1:3];
4) Append函数
使用方法:slice=append(slice,添加元素)
添加原理:
使用Append添加切片时,会新建一个Arr切片(满足扩容后的大小条件),然后在重新把slice拷贝到Arr,然后再引用到slice中,完成切片扩容。
5)copy(slice1,slice2)将slice2拷贝给slice1,修改slice1的值不影响slice2
6)string 自身就是一个byte切片;

三、Map

1、定义 :var 变量名 map [keytype] valuetype eg:var mapTest map[int] string上述定义了一个key为int类型,value为string类型的map;
2、注意事项:
1)Slice,Map,Function不能作为key来使用;
2)map的声明不能分配内存,分配内存后才能进行使用;
内存分配示例:

var map1 map[int] string
map1=make(map1[int]string,4) //给map1分配空间
//第二种方式定义
map1:=make(map1[int]string,4)

3)map的增删改查
增加,修改:

map["key"]="value"  
//当key值不存在就增加,当key值存在就修改

删除:

delete(map,"key")   //删除map中的key键值的value信息

查询:

val,ok:=map["查询的键值对"]
if ok{
  fmt.Println(val)
}else{
  fmt.Println("没有键值对的key值")
}

遍历:

var map1 map[int]int
map1=make(map1[int]int,4)
map1[0]=0
map1[1]=1
map1[2]=2
map1[3]=3
for i,v :=range map1{
   fmt.Println("map1的第%d位的值是%d",i,v)
}

4)map切片的使用

var slice []map[int]string  //定义map切片

5)map是引用类型,采用引用传递

如果大家看完对自己有些许帮助,请点赞支持,谢谢

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值