请以中文原生语言重新表达以下内容,只需要一个选项:Go语言规范第7部分(并发goroutine和通道)

总结

Go 语言规范概述。

上次:
Go语言规范6(goroutine 并发处理)

请用中文说出以下内容,只需给出一个选项。

    • goroutine と channel

channelの基本動作
goroutine + channel
close
select

协程和通道

    channelの基本操作
// 変数名 + chan + データ型
var ch chan int
// make関数でchannelとしての機能をもたせる(送受信どちらも可能)
ch = make(chan int)
// 宣言と同時にchannelとしての機能をもたせる(送受信どちらも可能)
ch2 := make(chan int)

// 送信専用channel
var sendChan <-chan int
// 受信専用channel
var receiveChan chan<- int
// bufferサイズ(容量)を調べるには、cap関数を使う
var ch chan int
fmt.Println(cap(ch)) // 0

// make関数の第2引数でbufferサイズを設定できる
ch2 := make(chan int, 5)
fmt.Println(cap(ch2)) // 5
// 送信
ch := make(chan int, 5)
ch <- 100
// データを一つ送信したため、chのデータ数は1
fmt.Println(len(ch)) // 1
// 送信したデータを受信する
fmt.Println(<-ch) // 100
// データを受信したため、データ数は0
fmt.Println(len(ch)) // 0
// データ数0の状態でさらにデータを受信しようとするとエラー
fmt.Println(<-ch) // fatal error: all goroutines are asleep - deadlock!

// 送信したデータの受信先を変数にもできる
ch2 := make(chan int, 5)
ch2 <- 100
ch2 <- 200
ch2 <- 300
i := <-ch2
// データの受信は、送信した順になる
fmt.Println(i) // 100
i = <-ch2
fmt.Println(i) // 200

// また、bufferサイズを超えた数のデータを送信しようとするとエラーとなる
ch3 := make(chan int, 3)
ch3 <- 10
ch3 <- 20
ch3 <- 30
ch3 <- 40 // fatal error: all goroutines are asleep - deadlock!

下面是要求您提供您的护照和签证复印件的文件清单。

    goroutine + channel

通道(Channel)用于在 Go 协程之间进行数据的发送和接收。

func goroutine(c chan string) {
    for {
        // 3. 送信されたデータを受信する
        fmt.Println(<-c)
    }
}

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    // 2. goroutineが走る
    go goroutine(ch1)
    go goroutine(ch2)

    for i := 0; i < 10; i++ {
        // 1. channelにデータ送信
        ch1 <- "Hello"
        ch2 <- "Golang"
        time.Sleep(50 * time.Millisecond)
    }
}
Hello
Golang
Hello
Golang
Golang
Hello
Golang
Hello
Golang
Hello
Golang
Hello
Golang
Hello
Golang
Hello
Golang
Hello
Golang
Hello

请用中文进行释义,只需提供一种选项:

Can you help me find my way back to the hotel?

    close

创建的通道默认为开放状态,但可以明确地关闭。

// makeで作成したchannelはオープン状態
ch := make(chan int, 1)

// close関数の引数にchannelを渡して、明示的にクローズする
close(ch)

// クローズしたchannelに対してデータを送信するとruntime errorになる
ch <- 1 // panic: send on closed channel

对于已关闭的频道,不可发送信息,但可接收信息。

ch := make(chan int, 1)
close(ch)
// クローズしたchannelからの受信は可能
fmt.Println(<-ch) // 0

如果接收信号,就可以分配两个变量。
第二个变量可以用布尔型来接收通道的打开/关闭状态。

ch := make(chan int, 1)
ch <- 1
i, ok := <-ch
// オープン状態のため、true
fmt.Println(i, ok) // 1 true

// channelをクローズ
close(ch)
i, ok := <-ch
// クローズしたため、false
fmt.Println(i, ok) // 0 false

// ※ 正確には、channelのbufferが空且つクローズ状態がfalseが返ってくる条件
ch2 := make(chan int, 2)
ch2 <- 2
close(ch3)
i2, ok := <-ch2
// channelはクローズしたが、データを受信していて空ではないため、trueとなる
fmt.Println(i2, ok) // 3 true

使用range循环遍历通道时的注意事项是,如果不明确关闭通道,即使取出了所有接收到的值,循环也会继续进行,从而导致错误。

如果不关闭它,第四次循环将会发生死锁。

func main() {
    ch := make(chan int, 3)

    ch <- 1
    ch <- 2
    ch <- 3

    for i := range ch {
        fmt.Println(i)
        // 1
        // 2
        // 3
        // fatal error: all goroutines are asleep - deadlock!
    }
}

需要保持关闭状态。

func main() {
    ch := make(chan int, 3)

    ch <- 1
    ch <- 2
    ch <- 3

    close(ch)

    for i := range ch {
        fmt.Println(i)
        // 1
        // 2
        // 3
    }
}

使用与goroutine 结合来进行操作验证。
循环100次接收数据,并尝试使用goroutine将接收到的数据输出,直到通道关闭为止。

func test(c chan int, s string) {
    for {
        i, ok := <-c
        // channelがクローズしたら、break
        if !ok {
            break
        }
        fmt.Println(i, s)
    }
    // 最後にENDを出力
    fmt.Println("END")
}

func main() {
    ch1 := make(chan int, 2)

    go test(ch1, "Goloang")
    go test(ch1, "Java")
    go test(ch1, "Python")

    for i := 0; i < 100; i++ {
        // channelにデータが送信されたら、3つのgoroutineのどれかが動く
        ch1 <- i
    }
    // ループが終わったらクローズする
    close(ch1)
    // closeした後にgoroutineの処理完了までちょっと待つ
    time.Sleep(1 * time.Second)
}

请用中文对以下内容进行释义,只需要一种选项:

There are many reasons why people enjoy traveling. Some people enjoy traveling to experience new cultures and see different sights. Others enjoy the adventure and thrill of exploring new places. Additionally, traveling can provide a break from daily routines and allow people to relax and recharge. Finally, traveling also offers the opportunity to create lifelong memories and meet new people.

    select

用于进行多个频道的发送和接收的语法结构。

如果想要处理多个通道而不使用select,当任何一个通道的发送或接收操作失败时,后续处理将无法执行。

func main() {
    ch1 := make(chan int, 3)
    ch2 := make(chan string, 3)

    // ch2のみデータを送信する
    ch2 <- "Golang"

    // ch1は空なので、エラー
    fmt.Println(<-ch1) // fatal error: all goroutines are asleep - deadlock!
    // データは受信しているが、ch1でエラーになり、処理が止まってしまう
    fmt.Println(<-ch2)
}

為了避免上述問題,可以使用select來執行多個通道而無需停止goroutine。

func main() {
    ch1 := make(chan int, 3)
    ch2 := make(chan string, 3)

    // ch2のみデータを送信する
    ch2 <- "Golang"

    // switchとは違い、どのcaseが実行されるかはランダム
    select {
    // ch1に受信時の処理
    case v1 := <-ch1:
        fmt.Println(v1)
    // ch2に受信時の処理
    case v2 := <-ch2:
        fmt.Println(v2)
    // caseに当てはまらない時の処理
    default:
        fmt.Println("default")
    }
}

下一次

Go 语言规范8(指针)

广告
将在 10 秒后关闭
bannerAds