Go语言进阶

73 阅读1分钟

1、并发

1.1 线程 VS 协程

image.png

1.2、Go协程实现方式

func main() {  
    for i := 0; i < 5; i++ {  
        go func(j int) {  
        fmt.Println(j)  
        }(i)  
    }  
    time.Sleep(time.Second)  
}

1.3、协程之间的通信

image.png

1.4、Go Channel

image.png

func main() {  
    src := make(chan int)  
    dest := make(chan int, 3)  
    go func() {  
        defer close(src)  
        for i := 0; i < 10; i++ {  
            src <- i  
        }  
    }()  
  
    go func() {  
        defer close(dest)  
        for i := range src{  
        dest <- i * i  
        }  
    }()  
  
    for i := range dest {  
    println(i)  
    }  
}

1.5 Go Lock

var (  
x int64  
lock sync.Mutex  
)  
  
func addWithLock() {  
    lock.Lock()  
    x += 1  
    lock.Unlock()  
}  
  
// main the function where execution of the program begins  
func main() {  
    for i := 0; i < 10; i++ {  
        go func() {  
            for i := 0; i < 1000; i++ {  
                addWithLock()  
            }  
        }()  
    }  
    time.Sleep(time.Second)  
    fmt.Println(x)  
}

1.6 WaitGroup

func ManyGoWait() {  
    var wg sync.WaitGroup  
    wg.Add(5)  
        for i := 0; i < 5; i++ {  
            go func(j int) {  
            defer wg.Done()  
            fmt.Println(j)  
        }(i)  
    }  
    wg.Wait()  
}