samete

第 899 号会员 /

回复了 samete 创建的主题: golang简单输出HELLO, WORLD!问题出在哪?

package main

import (
    "fmt"
    "runtime"
    "strings"
    "sync"
)

const words = "hello, world!"

var wg sync.WaitGroup
var finalWords string

// var mutex sync.Mutex

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    c := make(chan string)
    cc := make(chan string)

    for i := 0; i < len(words); i++ {
        wg.Add(2)
        go toUppercase(c, cc)
        go addWords(cc)
        c <- string(words[i])
        wg.Wait()
    }

    fmt.Println(words, finalWords)
}

func toUppercase(word chan string, cc chan string) {
    w, ok := <-word
    if !ok {
        close(word)
        return
    }
    var upperWord = strings.ToUpper(w)
    cc <- upperWord
    wg.Done()
}

func addWords(word chan string) {
    w, ok := <-word
    if !ok {
        close(word)
        return
    }
    // mutex.Lock()
    finalWords += w
    // mutex.Unlock()
    wg.Done()

}

我改成这样了,可以正确的输出,但是我没加锁

回复了 samete 创建的主题: go死锁的问题

我把代码改成这样:

package main

import (
    "fmt"
)

func main() {

    ch1 := make(chan int, 10)

    // fmt.Println(len(ch1), cap(ch1))
    for i := 0; i < cap(ch1); i++ {
        ch1 <- i
    }
    // fmt.Println(len(ch1), cap(ch1))

    for j := 0; j < len(ch1); j++ {
        c := <-ch1
        fmt.Println(c)
    }

}

为什么打印的结果是0 1 2 3 4 ?

回复了 samete 创建的主题: go死锁的问题

case e, ok = <-ch1: 当len(ch1)=0时,会把当前的协程切出去,这个只有main,没有可运行的协程,所以会死锁。
你是指这个协程就是主协程?