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") }