golang学习笔记2——容器和流程控制
Posted yubo_725
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang学习笔记2——容器和流程控制相关的知识,希望对你有一定的参考价值。
golang容器
golang中的容器主要有这几类:
- 数组
- 切片
- Map
- List
下面分别记录相关用法。
数组
数组的定义与初始化
数组的定义与初始化,用下面的代码来说明:
// 数组定义与初始化的第一种方式
var arr [2]int
arr[0] = 1
arr[1] = 20
// 输出 [1 20]
fmt.Println(arr)
// 数组定义与初始化的第二种方式
var names = [...]string"zhangsan", "lisi", "wangwu"
// 输出[zhangsan lisi wangwu]
fmt.Println(names)
数组的遍历
遍历数组使用如下方法:
names := [...]string"zhangsan", "lisi", "wangwu"
for key, val := range names
fmt.Println(key, val)
执行上面的代码输出:
0 zhangsan
1 lisi
2 wangwu
切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。
创建切片
下面是定义切片的代码:
// 定义一个整型切片
var slice []int
可以看到,定义切片与定义数组非常相似,区别就在于,定义数组时必须指定数组的大小,而定义切片时上面的[]
中不需要指定大小。
也可以从数组创建切片,代码如下:
// 定义names数组
names := [...]string"zhangsan", "lisi", "wangwu"
// 从数组创建切片
var a = names[1:2]
// 打印出[lisi]
fmt.Println(a)
// 打印出[zhangsan lisi wangwu]
fmt.Println(names)
也可以使用make
函数创建切片,代码如下:
// 使用make函数创建一个切片,切片大小为2
var slice = make([]int, 2)
// 打印出[0 0]
fmt.Println(slice)
切片的操作
- append 追加元素
使用append
可以为切片追加元素,示例代码如下:
var slice []int
slice = append(slice, 10)
slice = append(slice, 20)
// 打印[10 20]
fmt.Println(slice)
切片在定义时,会预先分配一定的空间,当使用append追加元素时,如果切片空间不够,则会自动扩容,扩容规律一般按照2的指数来进行,如1、2、4、8、16。
append
函数每次可以追加多个元素,如下代码所示:
var slice []int
slice = append(slice, 1, 3, 5, 7)
// 打印[1 3 5 7]
fmt.Println(slice)
- copy 复制切片
copy
函数可以将一个切片数据复制到另一个切片中,用法如下:
var slice []int
slice = append(slice, 1, 3, 5, 7)
var sliceCopy = make([]int, 4)
num := copy(sliceCopy, slice)
// 打印[1 3 5 7]
fmt.Println(slice)
// 打印[1 3 5 7]
fmt.Println(sliceCopy)
// 4
fmt.Println(num)
copy
函数的使用格式为:
copy(destSlice, sourceSlice) int
第一个参数表示目标切片,即要复制到的切片;第二个参数为源切片,即从哪个切片复制;最后copy
函数返回一个整型值,表示复制的数据的个数。
- 删除元素
golang中没有提供直接删除切片中元素的方法,可以使用append
将两个切片连接起来变相删除元素,如下代码:
var slice = []int1, 3, 5, 7, 9
// 删除下标为2的元素,即5
deleteIndex := 2
// 将5左右两边的切片连起来
slice = append(slice[:deleteIndex], slice[deleteIndex+1:]...)
fmt.Println(slice)
需要说明的一点是,上面代码中的slice[deleteIndex+1:]...
表示将slice[:deleteIndex+1]
这个切片展开,然后将元素一个个的追加到slice[:deleteIndex]
切片中。
Map
Map的定义
map表示使用键值对的形式存储的hash表,在golang中map的定义方式如下:
map[keyType]valueType
下面的代码使用make
函数创建了一个键为string类型,值也为string类型的map:
var data = make(map[string]string)
data["name"] = "zhangsan"
// 打印:map[name:zhangsan]
fmt.Println(data)
可以在声明Map的时候就给Map赋值,如下代码:
m := map[string]string
"name": "zhangsan",
"job": "teacher",
"hobby": "swimming", // 这个逗号不能省略,否则报错
// 打印:map[name:zhangsan job:teacher hobby:swimming]
fmt.Println(m)
Map的操作
Map的操作主要有遍历、删除、清空等,下面分别说明:
- 遍历Map
m := map[string]string
"name": "zhangsan",
"job": "teacher",
"hobby": "swimming",
for k, v := range m
fmt.Printf("%s, %s\\n", k, v)
- 删除Map数据
删除Map数据使用delete
函数,用法如下:
m := map[string]string
"name": "zhangsan",
"job": "teacher",
"hobby": "swimming",
delete(m, "job")
// 打印:map[name:zhangsan hobby:swimming]
fmt.Println(m)
- 清空Map数据
golang中并没有为 map 提供任何清空所有元素的函数、方法。清空 map 的唯一办法就是重新 make 一个新的 map。不用担心垃圾回收的效率。
List
golang中的List是一个双链表,主要用法如下:
l := list.New() // 或者使用var l list.List声明
eleHello := l.PushBack("hello") // 链表尾部插入元素
e := l.PushFront(1) // 链表头部插入元素
l.InsertAfter(2, e) // 在元素1后面插入2
l.Remove(eleHello) // 删除元素hello
// 遍历链表
for i := l.Front(); i != nil; i = i.Next()
fmt.Println(i.Value)
golang流程控制
if else
func main()
score := 80
if score > 90
fmt.Println("very good")
else if score >= 80 && score <= 90
fmt.Println("good")
else if score >= 60 && score < 80
fmt.Println("not bad")
else
fmt.Println("shit!")
for
func main()
arr := [10]int1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for i := range arr
if i == 6
break
fmt.Println(i)
for i := 0; i < 10; i++
fmt.Println(arr[i])
str := "hello golang!"
for k, v := range str
fmt.Printf("%d, %c\\n", k, v)
switch
func main()
s := "hello"
switch s
case "hello":
fmt.Println("hello")
// 这里不用break,默认就不继续执行下个case
case "world":
fmt.Println("world")
// 执行完这个case后,接着执行下个case
fallthrough
case "nihao", "good":
// 一个case分支多个值匹配
fmt.Println("nihao!")
default:
fmt.Println("nothing")
// case中包含表达式
switch
case s != "world":
fmt.Println("hahaha")
case s != "hello":
fmt.Println("hehe")
default:
fmt.Println("nice!")
以上是关于golang学习笔记2——容器和流程控制的主要内容,如果未能解决你的问题,请参考以下文章