[go语言]slice和map

sxt102400 · · 2156 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1 slice类型
slice是一个引用类型,是一个动态的指向数组切片的指针。
slice是一个不定长的,总是指向底层的数组array的数据结构。
src/pkg/runtime/runtime.h
struct!Slice
{ // must not move anything
byte* array; // actual data
uint32 len; // number of elements
uint32 cap; // allocated number of elements
};


1)创建slice
动态数组创建,类似创建数组,但是没有指定固定长度
var al []int     //创建slice
sl := make([]int,10)  //创建有10个元素的slice
sl:=[]int{1,2,3} //创建有初始化元素的slice


2) 先创建数组,在数组的基础上建立切片slice
var arr =[10]{1,2,3,4,5。6}  
sl := arr[2:5] //创建有3个元素的slice


3)slice有一些简便的操作
 - `slice`的默认开始位置是0,`ar[:n]`等价于`ar[0:n]`
 - `slice`的第二个序列默认是数组的长度,`ar[n:]`等价于`ar[n:len(ar)]`


3)数组和slice的区别
a.声明数组时,方括号内写明了数组的长度或者...,声明slice时候,方括号内为空
b.作为函数参数时,数组传递的是数组的副本,而slice传递的是指针。


2 map类型
map是一种引用类型,一种键值对存储方式,也是动态存储的。
map是一种无序的,不定长的数据结构
1)创建map
var 变量 map[键类型]值类型
var m map[string]int //创建map
m := make(map[string]int)    //创建map
m := map[string]int{"one":1, "two":2, "three":3 }  //创建有初始化元素的map
m := map[string]int{
"one":1, 
"two":2, 
"three":3, //如果不以}结束,必须以,换行。
}  




3 数组,slice,map的操作
下面几个是golang预定义的内建函数,无需导包就可以使用。
1)  数组,slice,map的长度或元素个数。
len(sl)  获取元素个数
cap(sl) 获取最大容量


2) slice的添加复制
append(目标sl,...元素) 添加一个或多个元素,返回一个slice(容量不够时,可能会改变指针指向的对象)。
copy(目标sl1, 源sl2[m:n]) 复制元素为源sl2的m-n位置。复制到目标sl1的0-len位置。 


3)map赋值,删除和检验
//map元素赋值
m["one"]=1


//删除map元素
delete(m,"one")  
m["one"] = 0,false


//检验map元素是否存在,如果存在ok返回为true,返回其值为val  
var val int
var ok bool   
val,ok = m["one"] 


4)数组,slice,map循环遍历
//循环map,返回map对象的键和值
for key,val := range m{
//语句
}


4 make与new
1)new
`new(T) 分配一个T类型的内存空间,并且指向这个对象的 *T类型的指针。(新建时内存空间会填充默认值(零值))


2)make(S, 长度L,容量V ) 创建一个S类型的数据结构。返回一个初始化后的S类型(相当于指针,make会初始化内部的数据结构,填充适当的值)。
()
比如slice,首先创建一个数组长度为 "[容量V]" 的S数组(初始化值填充默认值),然后建立一个slice片段的数据结构(指向数组前"长度L"个元素)。




3)new和make区别
 new(T) 可以用来创建普通类型,返回一个指向初始化T值的指针。
make(S) 只能用来创建slice,map,channel。返回一个初始化的S值(相当于指针)。

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:sxt102400

查看原文:[go语言]slice和map

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2156 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传