Concurrency ใน Go

Go Channels

Send values between goroutines with channels: unbuffered, buffered, close and range.

  • ระดับสูง
  • อ่าน 3 นาที
  • ตัวอย่างที่รันได้ 1 ตัวอย่าง
สิ่งที่คุณจะได้เรียนรู้
  • Send and receive
  • close and range
  • Buffered channels
Producer to main
  1. 1out <- messageproducer goroutine
  2. 2chan stringstep 1, step 2, step 3
  3. 3range messagesmain

A pipe between goroutines

A channel is a pipe that carries values from one goroutine to another. Sending and receiving wait for each other, so channels also keep goroutines in step.

out <- value sends and <-channel receives. An unbuffered channel hands each message directly to the receiver. close tells the receiver that nothing more will come, which ends the range loop. A buffered channel holds up to its capacity without a receiver.

ประเด็นสำคัญ

  1. ch <- v sends and <-ch receives.
  2. close ends a range loop.
  3. A buffered channel holds values without a receiver.

ตัวอย่าง Go ที่รันได้

Go
รันโค้ด →
main.go
package main

import "fmt"

func produce(steps int, out chan<- string) {
	for step := 1; step <= steps; step++ {
		out <- fmt.Sprintf("step %d done", step)
	}
	close(out) // tells the receiver there is nothing more
}

func main() {
	messages := make(chan string)
	go produce(3, messages)

	for message := range messages {
		fmt.Println("received:", message)
	}

	buffered := make(chan int, 2)
	buffered <- 1
	buffered <- 2
	fmt.Println(len(buffered), <-buffered, <-buffered)
}
สร้างปุ่ม Run สำหรับตัวอย่างนี้ ผลลัพธ์จากการรันโค้ด
received: step 1 done
received: step 2 done
received: step 3 done
2 1 2

ฝึกฝน

เปิดตัวอย่างในคอมไพเลอร์ออนไลน์ ลองเปลี่ยนค่าหรือเพิ่มบรรทัด แล้วทายผลลัพธ์ก่อนกดรัน จากนั้นลองทำให้โค้ดผิดโดยตั้งใจ แล้วอ่านข้อความจากคอมไพเลอร์

เรียนบทนี้จบแล้วใช่ไหม

ทำเครื่องหมายว่าเรียนแล้วเพื่อติดตามความคืบหน้า

ถัดไป: Select and Timeouts →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด