Go 语言入门指南(五) | 青训营

59 阅读2分钟

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了