defer
用于延迟一个函数或方法(或者当前所创建的匿名函数) 的执行
注意defer语句只能出现在函数或者方法的内部
defer经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数多复杂,都能保证任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后
defer延迟调用,main函数结束前调用
如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。哪怕函数或者某个延迟调用发生错误,这些调用依旧会被执行
func main(){
defer fmt.Println("a")
defer fmt.Println("b")
test(0)
defer fmt.Println("c")}
test(0)出错,打印
b
a
报错信息
func main(){
defer fmt.Println("a")
defer fmt.Println("b")
defer test(0)
defer fmt.Println("c")}
test(0)出错 打印
c
b
a
报错信息
defer和匿名函数结合使用
a:=10
b:=20
defer func(a,b int){
fmt.Printf("a=%d,b=%d\n",a,b)
}(a,b)
a=111
b=222
打印a=10,b=20
因为()代表调用此匿名函数,把参数传递过去,已经先传递参数,只是没有调用
获取命令行参数
package main
import "fmt"
import "os"
func main(){
//接收用户传递的参数,都是以字符串方式传递
list:=os.Args
n:=len(list)
fmt.Println("n=",n)
for i:=0;i<n;i++{
fmt.Printf("list[%d]=%s\n",i,list[i])
}
}
作用域
作用域,变量其作用范围
局部变量
定义在{}里面的变量就是局部变量,只能在{}里面有效
执行到定义那句话开始分配空间,离开作用域自动释放
if flag:=3;flag==3{ }
flag=4
报错 undefined flag
flag只属于if语句
全局变量
定义在函数外部的变量是全局变量
全局变量在任何地方都能使用
不同作用域的同名变量
不同作用域允许定义同名变量
使用变量的原则,就近原则
工程管理
工作区
Go代码必须放在工作区。工作区其实就是一个对应于特定工程的目录,包含3个子目录
- src 源代码
- pkg
- bin
src是必须得
包
以包作为管理单位
导入包
-
import "fmt"//导入包,必须使用,否则编译不过
-
import{
"fmt"
"os"}
-
.操作
import . "fmt"//调用函数无需通过包名
Println("")
可能跟自己写的变量重名
给包名起别名
import io "fmt"
忽略此包
import _ "fmt" Go语言入门还没结束,但是没时间了,好难,先开始Git了