数组的定义:var arrayName [size]dataType // arrayName := [5]dataType{1, 2, 3, 4, 5}
指针的定义:var var_name *var-type
切片的定义:var identifier []type 例:var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len) 也可以指定容量,其中 capacity 为可选参数。 make([]T, length, capacity) len() 和 cap() 函数 切片是可索引的,并且可以由 len() 方法获取长度。 切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。 append(name , 内容) //添加内容 copy() 函数//拷贝内容 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
for key, value := range oldMap { newMap[key] = value } //对切片进行遍历,key 和 value 是可以省略,顺序是固定的,若想省略则写”_“;
定义结构体 结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下: type struct_variable_type struct { member definition member definition ... member definition }
映射(Map):可以用len获取长度 例子:map1 := make(map[int]float32) //创建一个空的 map,key 是 int 类型,value 是 float32 类型 遍历方式与切片一样
m := make(map[string]int, 10) // 创建一个初始容量为 10 的 Map
// 删除键值对 delete(map1, "banana") delete() 函数 delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。 //map它的遍历顺序是偏随机的,是无序遍历的
通道(Channel): range 遍历从通道接收的值,直到通道关闭。 例子: ch := make(chan int, 2)//2指的是容量大小,必须要设置//有容量则是缓冲通道没有则是无缓冲 ch <- 1 ch <- 2 close(ch)//一定要关闭通道 //通道内容不能超过容量限制 遍历: for value := range oldMap {
}//只有value一个值
数值类型转换 将整型转换为浮点型: 例子:var a int = 10 var b float64 = float64(a) 字符串类型转换 将一个字符串转换成另一个类型,可以使用以下语法: var str string = "10" var num int num, _ = strconv.Atoi(str)//将字符串变量 str 转换为整型变量 num !!!注意,strconv.Atoi 函数返回两个值,第一个是转换后的整型值,第二个是可能发生的错误,我们可以使用空白标识符 _ 来忽略这个错误 strconv.Itoa(num)//将字符串转换为整数 strconv.ParseFloat(str, 64)//将字符串转换为浮点数 strconv.FormatFloat(num, 'f', 2, 64)//将浮点数转换为字符串
错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error 类型是一个接口类型,这是它的定义 type error interface { Error() string }
此函数会在包被导入时执行,例如在main函数中导入包,包中存在init()函数那么这个函数中的代码会在main()函数执行前执行,用于初始化包所需要的特定资料
例如:
package userPackage
import "fmt"
func init(){
fmt.printfln("tool init")
}//则会先输出init函数
init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等- 可以拥有多个
init函数 不能有返回参数- 同一个包中多个
init函数的执行顺序go语言没有明确的定义 对于同一个go文件的init()函数调用顺序是从上到下的 对同一个package中的不同文件,将文件名按字符串进行“从小到大”排序,之后顺序调用个文件中的init()函数。 - 不同包的
init函数按照包导入的依赖关系决定该初始化函数的执行顺序,例如导入顺序是main->A->B->C,则初始化顺序与之相反。main包总是被最后一个初始化,因为它总是依赖别的包 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
go程序加载过程
全局变量
↓
init函数
↓
main函数