内置函数
一、两个特殊的函数
1.init
init函数用于包(package)的初始化
1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
2 每个包可以拥有多个init函数
3 包的每个源文件也可以拥有多个init函数
4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
5 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
2.main
程序的默认入口函数
3.init和main的对比
相同点:
- 两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
- init可以应用于任意包中,且可以重复定义多个。
- main函数只能用于main包中,且只能定义一个。
init在main之前执行
二、内置函数
1.print、println:底层打印函数,在部署环境中建议使用 fmt 包
2.append:追加元素到切片中,返回修改后的切片,数组不能追加
当有预留的未使用的空间时,直接对未使用的空间进行切片追加,当预留的空间全部使用完毕的时候,
扩容的空间将会是当前的slice长度的一倍,
例如当前slice的长度为4,进行一次append操作之后,cap(a)返回的长度将会是8
3.len:求长度,比如string、array、slice、map、channel ,返回长度
4.copy:拷贝slice,返回拷贝的数目
dst:目标
src:源
从源拷贝到目标,返回的是拷贝的数量
dst := []int{1, 2, 3}
src := []int{4, 5}
ret := copy(dst,src)
1.不同类型的切片无法复制
2.如果dst的长度大于src的长度,将dst中对应位置上的值替换src中对应位置的值
3.如果dst的长度小于src的长度,多余的将不做替换
5.delete:从map中删除key对应的value
例:
map_data := map[string]interface{}{"name":"hallen","age":18}
delete(map_data,"name")
没有清空整个map的函数,建议重新定义个新的map,
不用担心垃圾回收的效率,Go语言中的并行垃圾回收效率比写一个清空函数要高效的多。
6.close:主要用来关闭channel
ch := make(chan int, 5)
close(ch) // 关闭ch
7.panic:手动触发错误
panic(err)
8.recover:恢复错误,结合defer使用
defer func() {
if err := recover(); err != nil {
logs.Error(" 错误 %s\r\n", err)
l.TplName = "success.html"
}
}()
9.real:返回complex的实部
var a complex64
a = 1.2 + 1.3i
b := 1.4 + 1.5i
// 取出实部和虚部的值
real_value := real(b)
imag_value := imag(b)
10.imag:返回complex的虚部
11.make:用来分配内存,只能应用于slice, map, chan,返回Type
make主要有一下三种用法:
1.make(map[string]string)、make(chan int) 只指定类型,适用于map和chan,slice不行(容器大小默认为0)
2.make([]int, 2) 指定了容器大小,返回的是一个容器大小为2的slice
3.make([]int, 2, 4) 第二参数是切片的长度,,第三个参数是预留的容器大小,包括前面的2个长度
a := make([]int, 4, 2),就会报语法错误。
12.new:用来分配内存,参数是一个类型,返回*Type
比如int、struct。返回指向Type的指针
它返回的永远是类型的指针,指向分配类型的内存地址,并且内存置为零值。
var a *int
a = new(int)
*a = 99
fmt.Println(*a)
fmt.Println(a)
注:make和new的区别:
- make 被用来分配引用类型的内存,返回的还是这三个引用类型本身,make常用。
- new 被用来分配除了引用类型的所有其他类型的内存,返回的是指向类型的指针。new不常用。
13.cap:capacity是容量的意思,用于返回某个类型的最大容量,只能用于切片和 chan
slice := make([]int,4,5) // 如果不指定容器大小,默认切片容器大小就是切片的长度
ma_cap := make(chan int,5)
fmt.Println(cap(slice))
fmt.Println(cap(ma_cap))
// 5,5
注:cap和len的区别:
- len求长度,
- cap求容器大小,容器大小如果不指定,则容器大小和长度保持一致