Go语言学习笔记2一 Golang的基础2

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关键词,我们可以使用其延迟执行的机制来实现资源的关闭。