// 定义数组: var a [3]int var a [3]int = [3]int{1,2,3} var a = [...]int{1,2,3} var a = []int{1,2,3} a := []int{1,2,3}
// 声明二维数组 var a [3][2]int a = [3][2]int {{11,2},{5,6}{8,3}}
切片:
slice [开始位置:结束位置]
动态创建切片:
make([]type,size) // type:切片元素类型,size:分配多少元素
append和copy方法:
a := []int{1,2,3,...} b := []int{5,5,5,5,5} append() //添加元素 copy(a,b) // b替换a的位置
cap和len:
切片slice:容量(cap)表示底层数组的大小,长度(len)可以使用的大小
当你用append扩展长度时,如果新的长度小于容量,不会更换底层数组,否则,go会重新申请一个底层数组。容量的用途就是在数据拷贝和内存申请的消耗与内存占用之间提供一个权衡。
map:go语言中的字典
一种元素对(pair)无序集合
var mapname map[keytype]valuetype // mapname为map变量名 // keytype为键类型 // valuetype为键对应的值类型 mapLit = map[string]int{"one": 1, "two": 2}
字符串排序:
sort.Strings(sceneList)
从字典(map)删除键值对
delete(map,键)
sync.Map(在并发环境中使用的map),Store表示存储,Load表示获取,Delete表示删除。
var scene sync.Map scene.Store("london",100) // 保存到sync.Map fmt.Println(scene.Load("london")) // 根据键删除键值 scene.Range(func(k,v interface{}) bool{ // 遍历sync.Map,遍历需要一个匿名函数,参数k,v,类型interface{},每次遍历一个元素后时,都会调用匿名函数把结果返回 fmt.Println(k,v) return true })
列表list:
使用New()函数和var关键字声明 1.new() 变量名 := list.New() 2.var var 变量名 list.List 列表元素可以为任意类型 在队列前方和后方插入元素,使用的方法PushFront和PushBack InsertAfter(v interface{},mark*Element)*Element // 在mark点之后插入元素 InsertBefore // 在mark点之前插入元素
列表插入函数的返回值会提供一个*list.Element结构
element :=l.PushBack("first") // 将first插入列表尾部,将这个元素的内部结构保存到element变量中 l.Remove(element) // 移除element变量对应的元素
遍历列表:
for i := l.Front();i != nil ; i = i.Next() { // i := l.Front()表示初始赋值,只会在开始执行一次,每次循环会进行一次 // i != nil如果返回false,则退出循环 // 反之则会执行i = i.Next(),遍历元素都会调用Next()函数 fmt.Println(i.value) }
nil:空值/零值
布尔类型的零值:false;数值类型的零值:0;字符串类型的零值:"";
指针(pointer),切片(slice),映射(map),通道(channel),函数(func)和接口(interface)的零值则为nil。 1.nil不能比较 2.nil不是关键字或保留字,可以定义一个名称为nil的变量 3.nil没有默认类型
new和make:创建并分配类型的内存,new值分配内存,make之内用于切片,映射,通道
var sum *int
sum = new(int) // 分配空间
new函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针,同时new函数会把分配的内存变成零,也就是该类型的零值
new函数返回的永远是类型的指针,指针指向的说类型的内存地址
make值用于切片,映射,通道的内存创建,它返回的就是引用类型