Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang cara menggunakan saluran dalam bahasa Go

Mari kita bincangkan tentang cara menggunakan saluran dalam bahasa Go

PHPz
PHPzasal
2023-04-18 09:07:36713semak imbas

Saluran (saluran) dalam bahasa Go ialah jenis data khas yang boleh digunakan untuk memindahkan data antara proses Go yang berbeza. Ia sama dengan paip yang membolehkan goroutine berbeza bertukar maklumat melaluinya. Dalam artikel ini, kami akan memperkenalkan penggunaan saluran dalam bahasa Go.

Buat saluran

Dalam bahasa Go, anda boleh menggunakan fungsi make untuk mencipta saluran. Sintaks fungsi make adalah seperti berikut:

make(chan data_type, buffer_size)

Antaranya, data_type ialah jenis data yang akan dihantar dalam saluran, dan buffer_size menunjukkan saiz buffer saluran Jika saiz buffer tidak ditentukan, ini bermakna saluran tidak dibuffer.

Sebagai contoh, dalam kod berikut, saluran yang tidak ditimbal dibuat:

ch := make(chan int)

Di sini, saluran dicipta yang melepasi jenis integer. Saluran tidak buffer boleh digunakan untuk operasi segerak, seperti menyekat dan menunggu antara dua goroutine.

Berikut ialah contoh mencipta saluran penimbal:

ch := make(chan string, 10)

Di sini, saluran dicipta untuk menghantar jenis rentetan dan saiz penimbal ditetapkan kepada 10. Saluran buffer boleh digunakan untuk operasi tak segerak, yang bermaksud operasi hantar dan terima tidak menyekat pelaksanaan program.

Menghantar dan menerima data

Dalam bahasa Go, anda boleh menggunakan pengendali anak panah (<-) saluran untuk menghantar dan menerima data. Anak panah menunjuk ke arah saluran menunjukkan arah aliran data.

Sebagai contoh, kod berikut menghantar integer ke saluran:

ch := make(chan int)
ch <- 123

Di sini, integer 123 dihantar ke saluran ch menggunakan operator anak panah (<-).

Kod berikut menerima integer daripada saluran:

ch := make(chan int)
x := <- ch

Di sini, integer diterima daripada saluran ch menggunakan pengendali anak panah (<-). Di sini x ialah pembolehubah integer yang digunakan untuk menyimpan nilai yang diterima daripada saluran.

Menyekat dan menunggu

Dalam saluran yang tidak buffer, kedua-dua operasi hantar dan terima akan menyebabkan penyekatan. Sebagai contoh, jika goroutine menghantar data ke saluran yang tidak dibuffer, tetapi tiada goroutine lain menunggu untuk menerima data, operasi penghantaran akan menyekat sehingga goroutine lain mula menunggu untuk menerima data.

Begitu juga, jika goroutine menerima data daripada saluran tidak buffer, tetapi tiada goroutine lain menunggu untuk menghantar data, operasi penerimaan akan menyekat sehingga goroutine lain mula menghantar data.

Apabila penimbal bersaiz terhad, operasi hantar juga mungkin menyekat Jika penimbal penuh, operasi hantar akan menunggu sehingga goroutine lain membaca data daripada saluran.

Sebagai contoh, kod berikut menunjukkan cara untuk mencipta saluran tidak buffer dan membenarkan dua goroutine bertukar-tukar data melalui saluran:

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

  go func() {
    x := 1 + 1
    ch <- x
  }()

  y := <-ch

  fmt.Println(y)
}

Di sini, saluran tidak buffer dicipta saluran ch, dan kemudian memulakan goroutine baharu yang menghantar nilai 2 ke saluran ch. Pada ketika ini, operasi menerima akan menyekat sehingga proses Gor baharu menghantar nilai 2, dan akhirnya mencetak nilai yang diterima ke konsol.

Tutup saluran

Dalam bahasa Go, anda boleh menggunakan fungsi terbina dalam dekat untuk menutup saluran. Selepas menutup saluran, semua data yang belum dibaca boleh dibuang, manakala data yang telah dibaca masih boleh diakses.

Tutup saluran untuk memberitahu penerima bahawa tiada lagi data akan dihantar, yang membolehkan penerima keluar dari gelung seperti biasa dan menamatkan program.

Sebagai contoh, contoh kod berikut menunjukkan cara untuk menamatkan program dengan menutup saluran:

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

  go func() {
    for i := 0; i < 5; i++ {
      ch <- i
    }
    close(ch)
  }()

  for v := range ch {
    fmt.Println(v)
  }
}

Di sini, saluran ch yang tidak ditimbal dibuat dan goroutine baharu dimulakan , digunakan untuk hantar nilai integer ke saluran ch. Selepas semua nilai integer telah dihantar, saluran ch ditutup. Seterusnya, gunakan gelung for untuk mengulangi semua nilai dalam saluran ch dan cetak ke konsol.

Ringkasan

Dalam bahasa Go, saluran ialah alat berkuasa yang boleh digunakan untuk melaksanakan komunikasi data antara proses Go yang berbeza. Anda boleh menggunakan saluran untuk menghantar dan menerima data, dan menggunakan pengendali anak panah (<-) untuk mengenal pasti aliran data. Anda boleh membuat saluran tidak buffer atau buffer dan bertukar-tukar data antara goroutine. Dengan menutup saluran, penerima tahu bahawa tiada lagi data dihantar dan menghentikan pelaksanaan program.

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara menggunakan saluran dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn