Golang包的引入存在几个注意点
包的引入是从$GOPATH/src后开始计算的,使用/进行路径分割。在新版Golang中,需要使用项目管理器,现在项目目录下使用 go mod init xxxx
创建项目,同一项目可以直接import
package包的声明建议这个包和所在的文件夹同名。
如果需要import多个包,可以用()包括。
如果包名和文件夹名不一样,import使用文件夹路径,函数调用使用包名
import路径前可以给包取别名,这样原名就不能用了。
函数调用时,如果函数名首字母大写,表示该函数公开,可以调用,反之表示私有
init函数
每个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用。
func init(){}
如果源文件存在全局变量的定义,则优先于init方法
如果多个源文件存在init方法,先由main文件运行,再由其他文件运行
匿名函数
Go支持匿名函数,这个函数方法只会使用一次,其存在两个使用方法
1.在定义时直接调用:
result :=func (a int,b int) int {
return a+b
}(10,11)
//这里最后需要加上括号来引入变量
2.赋值给一个变量,再通过该变量调用
result :=func (a int,b int) int {
return a+b
}
a:=result(10,11)
如果需要让一个匿名函数可以在整个程序中有效,只要将函数赋值给一个全局变量就行了
闭包
Golang内存在一个闭包的概念,闭包就是一个函数和其相关的引用环境组合的一个整体。
例子:
package main
import "fmt"
//函数功能:求和
//函数的名字:getSum 参数为空
func getSum() func (int) int { //getSum函数返回值为一个函数,而这个函数返回值是int类型
var sum int = 0
return func (num int) int{
sum = sum + num
return sum
}
}
//闭包:返回的匿名函数+匿名函数以外的变量num
func main(){
f := getSum()
fmt.Println(f(1))//1
fmt.Println(f(2))//3
fmt.Println(f(3))//6
fmt.Println(f(4))//10
}
这里可以发现,闭包中,匿名函数中引用的变量会一一直存放在内存中,可以一直使用。
闭包的本质:
闭包本质依旧是一个匿名函数,只是这个函数引入外界的变量/参数 匿名函数+引用的变量/参数 = 闭包
(1)返回的是一个匿名函数,但是这个匿名函数引用到函数外的变量/参数 ,因此这个匿名函数就和变量/参数形成一个整体,构成闭包。 (2)闭包中使用的变量/参数会一直保存在内存中,所以会一直使用—》意味着闭包不可滥用(对内存消耗大)
//不使用闭包的时候:我想保留的值,不可以反复使用 //闭包应用场景:闭包可以保留上次引用的某个值,我们传入一次就可以反复使用了
defer关键字
在函数中,我们会需要创建资源,为了在函数执行后,及时的释放资源,Golang提供了defer关键词。
defer后的语句不会立刻执行,而是将语句压入栈中,然后执行之后的语句,在函数执行完毕后,从栈中取出语句开始执行。
需要注意的是,defer会将代码语句相关的值拷贝压入栈中,这些值不会随函数后面的变化而变化。
通过defer关键词,我们可以使用其延迟执行的机制来实现资源的关闭。