Go中的array、slice和map
- array
数组的定义
var arr [10]int // 定义数组arr,默认初始值均为0
arr[0] = 1 // 改变数组第一个元素的值为1
arr := [3]int{1, 2, 3}
arr := [...]int{1, 2, 3} // 注意..., 表示由编译器自己统计数组的大小
/* 多维数组 */
arr := [3][2]int{{1,2},{2,3},{3,4}} // 合理
arr := [...][2]int{{1,2},{2,3},{3,4}} //合理
/* arr := [3][...]int{{1,2},{2,3},{3,4}} 错误 */
- slice
相当于python里面的切片,但两者有差别。go里面的slice是一个指向数组的指针,且为引用类型。这意味着当赋值某个slice到另外一个变量,两个引用会指向同一个数组。如果一个函数需要一个slice参数,在其内对slice元素的修改也会体现在函数调用中,这和传递底层的数组的指针相似。
s := make([]int, 10) // 创建一个保存有十个元素的slice
/* slice总是与一个固定长度的array成对出现,其影响slice的容量和长度*/
arr := [...]int{1,2,3,4,5}
s1 := a[2:4] // 创建序号为2-3(不含4)的slice
s2 := a[:] // 创建一个与arr等长的slice
s3 := s[:4] //用slice 创建slice
Go关键字
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
控制结构
- if、 else
/* 用法: 除了条件不需要括号 ,其它和C一样*/
if condition{
//...
}
// 或者 if-else if-else 结构
if codition1{
//...
}else if codition2{
//...
}else{
//...
}
- for、 continue、 break
for init;condition;post{} // 常规用法
for condition{} // 相当于C语言的while
for{} // 死循环
/* continue 和 break 的用法和C语言相似 */
- switch、default、 fallthrough
/* 用法一 */
switch exp{
case cons1:exp1
case cons2:exp2
//...
case consn:expn
default:exp_
}
/* 用法二 */
switch{ // switch没有表达式,它就会执行case 表达式中为true的部分
case cond1:exp1
//...
case condn:expn
}
/* switch 语句使用fallthrough关键字 */
switch i{ // 如果i==0,它不会向下匹配执行exp1
case 0:
case 1:exp1 // exp1不会被执行
}
switch i{ // 如果i==0,它会执行exp1
case 0: fallthrough
case 1:exp1 // exp1会被执行
}
- map、range
关键字map可以认为是一个用字符串做索引的数组
salary :=map[string]int{
"Jane":3000, "Tony":2500, "Marry":1800, // 最后一个逗号必须要有
}
for key, value := range salary{ /* 有点像python的字典 */
fmt.Printf("%s\t%d\n", key, value)
}
[output]
>>>Jane 3000
Tony 2500
Marry 1800
delete(salary, "Jane") // 内建函数delete删除元素 "Jane"
内建函数
close | new | panic | complex |
---|---|---|---|
delete | make | recover | real |
len | append | image | |
cap | copy | println |
- append、copy
/* append用于追加slice */
s0 := []int{0, 0}
s1 := append(s0, 1) // 追加元素2到s0末尾, s1 == []int{0, 0, 1}
s2 := append(s1,2,3,4) // 追加多个元素
s3 := append(s2, s0...) // 追加一个slice, 注意后面三个点
/* copy 用于复制slice, 返回复制的元素的个数 */
arr := [...]int{1, 2, 3, 4, 5, 6, 7}
var s = make([]int, 5) // 创建一个类型为[]int,保存5个元素的slice
n := copy(s, arr[:]) // n==5, s内的值为a[:5]
- close
用于channel通信,使用它来关闭channel - delete
用于在map中删除实例 - cap 、 len
cap返回切片的容量
len用于返回字符串、slice和数组的长度 - new、make
new 用于各种类型的内存分配
make([]T, len, cap)用于内建类型的内存分配 - panic、recover
用于异常处理机制 - complex、real、imag
用于复数
有疑问加站长微信联系(非本文作者)