• go基础(三)


    一、mutex锁与信道

    package main
    
    利用mutex:
    //import (
    //"fmt"
    //"sync"
    //)
    //var x  = 0
    //func increment(wg *sync.WaitGroup, m *sync.Mutex) {
    //
    //    m.Lock()
    //    x = x + 1
    //    m.Unlock()
    //    wg.Done()
    //}
    //func main() {
    //    var w sync.WaitGroup
    //    var m sync.Mutex
    //    for i := 0; i < 1000; i++ {
    //        w.Add(1)
    //        go increment(&w,&m)
    //    }
    //    w.Wait()
    //    fmt.Println("final value of x", x)
    //}
    

    利用信道:
    import ( "fmt" "sync" ) var x = 0 func increment(wg *sync.WaitGroup, ch chan bool) { ch <- true x = x + 1 <- ch wg.Done() } func main() { var w sync.WaitGroup ch := make(chan bool, 1) for i := 0; i < 1000; i++ { w.Add(1) go increment(&w, ch) } w.Wait() fmt.Println("final value of x", x) }

    二、异常处理

    //异常处理
    package main
    
    import "fmt"
    
    func main() {
        //defer 延迟执行,先注册的后执行,即便函数出现严重错误,它也会执行
        //defer fmt.Println("xxxxxxx")
        //defer fmt.Println("yyyy")
        f1()
        f2()
        f3()
    
    }
    func f1()  {
        fmt.Println("f1")
    }
    func f2()  {
        //defer fmt.Println("我除需哦了")
    
        //defer func() {
        //    recover()    //恢复程序
        //}()
        defer func() {
            if ok:=recover();ok!=nil{
                //如果是nil表示没有出异常,如果有值表示出了异常,这个值就是异常信号
                //进行异常处理
                fmt.Println(ok)
            }
        }()
        fmt.Println("f2")
        //var a =make([]int,3,3)
        //fmt.Println(a[4])  //把异常处理掉,让程序继续往下执行
        panic("出错了")  //主动抛出异常
        //fmt.Println("xxxxx")
    }
    func f3()  {
        fmt.Println("f3")
    }
  • 相关阅读:
    HTML链接/实施CSS的三种方法
    XML之Well-Formed文档规则
    【摘】SVN提交与版本冲突
    Web开发之404小结
    TCP 连接的要点
    [转] Epoll 相对Poll和Select的优点
    [转] 剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)
    GDB调试技巧
    [转] 关于c++的头文件依赖
    [转] Linux中gcc,g++常用编译选项
  • 原文地址:https://www.cnblogs.com/sima-3/p/11916845.html
Copyright © 2020-2023  润新知