• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go语言学习之延迟执行语句

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

 

 

// GO 语言defer(延迟执行语句)
// Go 语言的 defer 语句会将其后面跟随的语句进行延迟处理。
// 在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,
// 也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。
package main
import(
   "fmt"
   "sync"
   "os"
   "strconv"
)

func PrintStr(str string){
    fmt.Println(str)
}

func testDeferOrder(){
    PrintStr("函数开始执行")
    str := "延迟调用函数"
    defer PrintStr(str + "1")
    defer PrintStr(str + "2")
    defer PrintStr(str + "3")
    PrintStr("函数结束执行")
} 

var (
    // 一个演示用的映射
    valueByKey      = make(map[string]int)
    // 保证使用映射时的并发安全的互斥锁
    valueByKeyGuard sync.Mutex
)
func readValue(key string) int {
    valueByKeyGuard.Lock()
     // defer后面的语句不会马上调用, 而是延迟到函数结束时调用
     defer valueByKeyGuard.Unlock()
      return valueByKey[key]
}


func fileSize(filename string) int64 {
    f, err := os.Open(filename)
    if err != nil {
        return 0
    }
    // 延迟调用Close, 此时Close不会被调用
    defer f.Close()
    info, err := f.Stat()
    if err != nil {
        // defer机制触发, 调用Close关闭文件
        return 0
    }
    size := info.Size()
    // defer机制触发, 调用Close关闭文件
    return size
}

func main(){
    // 测试执行顺序
    testDeferOrder();
    // 使用延迟执行语句在函数退出时释放资源
    // 1 使用延迟并发解锁
    readValue("这个函数复用的别人代码")
    // 2 使用延迟释放文件句柄
    sFileName := "//home//liq-n//桌面//1.png"
    fmt.Println("1.png fileSize:" + strconv.FormatInt(int64(fileSize(sFileName))/1024,10) + "KB" )
    // fmt.Println(fmt.Sprintf("%d",fileSize("//home//useName//桌面//1.png")))    
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
vue中使用go()和back()两种返回上一页的区别发布时间:2022-07-10
下一篇:
go变量赋初值发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap