zoukankan      html  css  js  c++  java
  • [GO]goexit的使用

    package main
    
    import "fmt"
    
    func test()  {
        defer fmt.Println("cccccccccccc")//在函数退出前执行
        fmt.Println("ddddddddddddddd")
    }
    
    func main() {
    
        go func() {
            fmt.Println("aaaaaaaaaaaaaaaaaa")
            test()
            fmt.Println("bbbbbbbbbbbbbbbbb")
        }()
    
        for true {
        }
    }

    这里执行的结果为

    aaaaaaaaaaaaaaaaaa
    ddddddddddddddd
    cccccccccccc
    bbbbbbbbbbbbbbbbb

    但是如果在defer fmt.Println("cccccccccccc")的下面加一句return呢?

    ...
    func test()  {
        defer fmt.Println("cccccccccccc")//在函数退出前执行
        return 
        fmt.Println("ddddddddddddddd")
    }
    ...

    那么执行结果就是

    aaaaaaaaaaaaaaaaa
    cccccccccccc
    bbbbbbbbbbbbbbbbb

    return的意思是终止此函数,那么在终止前又有一个defer所以才会打印ccccccccc,那么dddddddddddd自然不会被执行

    下面我们的goexit出场

    package main

    import (
    "fmt"
    "runtime"
    )

    func test() {
    defer fmt.Println("cccccccccccc")//在函数退出前执行
    //return
    runtime.Goexit() //退出所在子协程
    fmt.Println("ddddddddddddddd")
    }

    func main() {

    go func() {
    fmt.Println("aaaaaaaaaaaaaaaaaa")
    test()
    fmt.Println("bbbbbbbbbbbbbbbbb")
    }()

    for true {
    }
    }

    那么执行结果就是

    aaaaaaaaaaaaaaaaaa
    cccccccccccc

    因为goexit的意思的退出所在子协程,所以连bbbbbbbbb都不会被打印了

  • 相关阅读:
    Module:template
    Grunt:GruntFile.js
    Grunt:常见错误
    架构:架构-1
    架构:目录
    DS:template
    Jasper:用户指南 / 设备 / 生命周期管理 / SIM 卡状态
    Jasper-Api:接口测试
    linux服务之git
    Java实现 洛谷 P1487 陶陶摘苹果(升级版)
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9672421.html
Copyright © 2011-2022 走看看