A1B2C3

使用兩個goroutine 一個印出 A-Z, 一個印出1-26


方法一

https://go.dev/play/p/-xtRmyfrede

package main

import (
    "fmt"
    "sync"
)

func main() {
    abc := make(chan int)
    num := make(chan int)
    wg := sync.WaitGroup{}
    wg.Add(2)
    go func() {
        defer wg.Done()
        for i := 65; i <= 90; i++ {
            fmt.Print(string(rune(i)))
            abc <- i
            <-num
        }
    }()

    go func() {
        defer wg.Done()
        for i := 1; i <= 26; i++ {
            <-abc
            fmt.Print(i)
            num <- i
        }
    }()
    wg.Wait()
}

方法二: 緩衝

https://go.dev/play/p/iJ-gYxeqv31

package main

import (
    "fmt"
    "sync"
)

func main() {
    abc := make(chan int, 1)
    num := make(chan int, 1)
    wg := sync.WaitGroup{}
    wg.Add(2)
    abc <- 0
    go func() {
        defer wg.Done()
        for i := 65; i < 91; i++ {
            <-abc
            fmt.Printf("%s", string(rune(i)))
            num <- i
        }
    }()

    go func() {
        defer wg.Done()
        for i := 1; i < 27; i++ {
            <-num
            fmt.Printf("%d", i)
            abc <- i
        }
    }()
    wg.Wait()

}

方法三: mutex

https://go.dev/play/p/F830P2F_BiU

package main

import (
    "fmt"
    "sync"
)

func main() {
    abcMux := sync.Mutex{}
    numMux := sync.Mutex{}
    wg := sync.WaitGroup{}
    wg.Add(2)
    numMux.Lock()
    go func() {
        defer wg.Done()
        for i := 65; i < 91; i++ {
            abcMux.Lock()
            fmt.Printf("%s", string(rune(i)))
            numMux.Unlock()

        }
    }()

    go func() {
        defer wg.Done()
        for i := 1; i < 27; i++ {
            numMux.Lock()
            fmt.Printf("%d", i)
            abcMux.Unlock()

        }
    }()
    wg.Wait()
}
© Kimi Tsai all right reserved.            Updated : 2023-07-12 09:04:53

results matching ""

    No results matching ""

    results matching ""

      No results matching ""