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")
}
原文地址:https://www.cnblogs.com/sima-3/p/11916845.html