公司最近打算启动一个新项目:实现接口级别的mock服务,技术栈需要利用Go的超强并发能力。很早就听闻过Go的大名了,趁这个机会跟着大佬们学一学,目前还在不断学习中,边学习边整理整理学习笔记。
一、包
package <name>
包有两种类型,可执行包和应用包。
- 可执行包生成可执行程序,必须使用
package main
,而且文件中必须有且仅有一个main函数。 - 应用包本身是不可执行的,编写保存后会自动在pkg目录下保存一个.a文件,包内可以有多个源文件,其中被引用的方法需要设置为:首字母大写.。设置包名name时一般与文件名相同,但这并不是必须的。
import <packagename>
导入源码文件所依赖的包,导入的包其实就是目录名。Go程序首先会去“GOROOT/src”目录下找,如果没找到则会继续去“GOPATH/src”找。
二、数组VS切片
切片是拥有相同类型元素的可变长度的序列,数组是不可变的,可以理解为切片是指向数组的某块区域的引用,可以是数组的一部分也可以是全部。
1.切片的初始化
- 数组:
var name [num]T
默认初始化,有默认值
var name = [num]T{n1,n2,…}
使用指定值初始化 - 切片:
var name []T
声明一个切片,未初始化,为nil(切片、函数、指针变量的默认为nil)
var name = []T{n1,n2,…}
初始化一个切片,不为nil
可以看出: 数组和切片初始化的明显也是唯一的区别就是数组必须定义长度,而切片不用定义长度。这也体现了它们的不可变长度与可变长度的特点。
2.得到切片
- 初始化切片
- 利用数组得到切片
a := [4]int{1,2,3,4}
初始化一个数组
b := a[1:3]
//左闭右开,包含a[1],a[2]:[2,3] - 切片再切片
c := b[0:2]
//包含a[1],a[2]:[2,3]
d := b[1:3]
//包含a[2],a[3]:[3,4] - 构造切片
使用make()函数构造,make([]T,size,cap)
// size: 切片中元素的数量;cap: 切片的容量
a := make([]int,5,10)
则:len(a);
//5cap(a);
//10 (内存空间给切片分配了10个,只使用了5个。)
关于切片的类型和实质,我画了个图应该可以看的很清楚。切片是引用类型,一个切片包含三个部分:指针、长度、容量,下图可见,该切片指向底层数组a[2],长度为4,容量为7。
3.遍历
- 索引遍历:
for i := 0; I < len(s); i++{}
- for range遍历:
for index, value := range{}
4.用append()方法为切片添加元素
- 切片会自动扩容,容量会按1,2,4,8,16,…… 扩充
利用方法:s = append(s, i)
把元素 i 添加到切片中的元素后
5.用copy()方法复制切片
- 如果直接把切片1的值赋给切片2,那么它们实际上使用的是同一个底层数组,修改其中任意一个切片的值都会影响另一个切片,因此需要用其他方法来复制切片:
copy(destSlice, srcSlice)
destSlice:目标切片,srcSlice: 源切片
6.删除切片中的元素
- 切片是引用类型,不像数组一样长度空间都十分固定,要删除切片的元素,可以利用它的特性:
s := []int{0,1,2,3,4,5}
s = append(s, a[:3],a[4:])
//删除第3个元素