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值(相当于指针)。
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值(相当于指针)。
有疑问加站长微信联系(非本文作者)