• [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都不会被打印了

  • 相关阅读:
    Redis常用操作命令
    redis-sentinel.conf配置项详解
    Kafka常用命令
    go modules的使用姿势
    GO语言密码加解密(bcrypt)
    ssh-copy-id 秘钥分发报错
    k8s 命令提示
    算法与数据结构(持续更新)
    【spring】 @PostConstruct注解
    Spring Boot 整合Redis
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9672421.html
Copyright © 2020-2023  润新知