Go 其他特性

PRE_ZHY · · 1038 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go 其他特性

为了保持 Go 语法介绍的完整性,有一些 Go 独有的特性,并没有在前面的章节介绍。说 Go 独有的特性其实并不恰当,因为其他语言并非在语言层面定义上下面的几个特性。
本节想介绍的关键字与函数包括 defer, append, close, make, new, copy, delete,只有第一个是关键字,后6个都是内置函数。

defer

defer 是 Golang 中的广义的通用析构函数。析构函数是在Java,C++类中所定义的一类在类被销毁时执行收尾的函数。什么叫收尾,就是类似于离家出门前总是要锁门;下班了总是要打卡这样一类,默认都需要在结束时做的事情。在函数结束时,哪些工作需要收尾呢?

  • 打开的文件要关闭,不管发生读写任何操作;
  • 打开的网络连接要关闭,不管你访问了哪些资源;
  • 共享的锁子要解锁,不管你修改了哪些东西;

总之类似于此的公共资源,由你借出最后必然要由你归还。问题是,常常,常常就忘了。如何不忘记呢?就是打开的地方就设置要关闭。defer 就是这样一个关键字,后面接一个函数/方法,表示延时执行,延时作用范围为,延迟到函数发生return之后动作。例如

filehandle, err := os.Open("FileName")
if err != nil{
    return 
}
defer filehandle.Close()

defer 有三个重要点需要注意:

  1. 当defer被声明处时,其参数就会被解析确定
  2. defer执行顺序为先进后出,即多个defer声明,按照倒叙执行
  3. defer 语句是在 return 后执行,但defer依然在函数作用范围内。

看下面的例子:


func addself(i int) {
    fmt.Println("add_Enter:", i)
    i = i + 1
    fmt.Println("add_Leave:", i)
}
func addself2(i *int) {
    fmt.Println("add_Enter:", *i)
    *i = *i + 2
    fmt.Println("add_Leave:", *i)
}

func printN(i *int) int {
    defer addself(*i)
    fmt.Println("Enter:", *i)
    *i = *i + 1
    fmt.Println("Meddle:", *i)
    defer addself2(i)
    fmt.Println("Leave:", *i)
    return *i
}

func main() {
    anum := 10
    fmt.Println(printN(&anum))
    fmt.Println(anum)
}
/* ---- Result -------------
Enter: 10
Meddle: 11 // printN ++ 
Leave: 11 
add_Enter: 11 // 取printN自加的值作为输入,后面defer先执行
add_Leave: 13
add_Enter: 10 // 取刚刚进入的值作为输入,最后执行
add_Leave: 11
11 // 函数值返回值为 11
13 // i 最终的值为13,已经在确定i返回值之后才执行defer函数
*/

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:PRE_ZHY

查看原文:Go 其他特性

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1038 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传