golang学习笔记2——容器和流程控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yubo_725/article/details/89518173

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 = []int{1, 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]int{1, 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!")
	}
}
展开阅读全文

没有更多推荐了,返回首页