Rumah > pembangunan bahagian belakang > Golang > Cara membuat saluran baca sahaja dalam golang

Cara membuat saluran baca sahaja dalam golang

PHPz
Lepaskan: 2023-04-05 10:24:39
asal
683 orang telah melayarinya

Saluran di Golang ialah jenis data khas yang digunakan untuk berkomunikasi antara berbilang goroutin. Chanel menyokong dua operasi: menghantar dan menerima. Operasi hantar menghantar nilai ke saluran, dan operasi terima menerima nilai daripada saluran.

Secara lalai, saluran boleh dibaca dan ditulis, yang bermaksud mana-mana goroutine boleh menghantar dan menerima operasi melalui saluran. Walau bagaimanapun, dalam beberapa kes, kita perlu mengehadkan gorout tertentu untuk hanya menerima tetapi tidak menghantar, atau hanya menghantar tetapi tidak menerima. Pada masa ini, saluran baca sahaja boleh berguna.

Saluran baca sahaja boleh dibaca oleh berbilang goroutin pada masa yang sama, tetapi tidak boleh ditulis kepadanya. Ia boleh digunakan untuk melaksanakan struktur data kongsi baca sahaja untuk mengelakkan isu konkurensi. Dalam bahasa Go, terdapat perbezaan antara saluran baca sahaja dan saluran biasa dan saluran baca sahaja dan saluran tulis sahaja adalah daripada jenis yang berbeza.

Cara membuat saluran baca sahaja

Saluran baca sahaja boleh dibuat dengan menambahkan simbol <- di hadapan jenis saluran biasa. Contohnya, jika kita mempunyai saluran biasa:

ch := make(chan int)
Salin selepas log masuk

Untuk menukarnya kepada saluran baca sahaja, kita boleh menulisnya seperti ini:

roCh := <-chan int(ch)
Salin selepas log masuk

Di sini, kami mencipta Saluran baca sahaja, jenisnya ialah <-chan int, iaitu saluran jenis int baca sahaja. Ambil perhatian bahawa saluran baca sahaja ini adalah jenis yang berbeza daripada saluran biasa yang asal, walaupun kedua-duanya digunakan untuk menghantar data jenis int.

Pelaksanaan saluran baca sahaja

Untuk saluran baca sahaja, kami hanya boleh membaca data daripadanya dan tidak boleh menulis data ke dalamnya. Oleh itu, apabila menggunakan saluran baca sahaja, kita perlu memberi perhatian kepada dua perkara:

  1. Tidak boleh melakukan operasi penghantaran pada saluran baca sahaja, jika tidak, ia akan menyebabkan ralat penyusunan.
  2. Jika kami menukar saluran boleh tulis kepada saluran baca sahaja, maka saluran baca sahaja dan saluran boleh tulis akan menghala ke blok data yang sama, jadi operasi penghantaran boleh dilakukan pada saluran boleh tulis, dan Terima melalui saluran baca sahaja.

Berikut ialah contoh mudah yang menunjukkan penggunaan saluran baca sahaja:

package main

import "fmt"

func main() {
    ch := make(chan int, 10)
    for i := 0; i < 10; i++ {
        ch <- i
    }

    // 只读channel
    roCh := (<-chan int)(ch)

    // 从只读channel中读取数据
    for x := range roCh {
        fmt.Println("value:", x)
    }
}
Salin selepas log masuk

Dalam contoh ini, kami mula-mula mencipta saluran boleh tulis dan 10 integer adalah ditulis kepadanya. Seterusnya, kami menukar saluran boleh tulis ini kepada saluran baca sahaja dan membaca data daripadanya melalui saluran baca sahaja ini. Akhirnya, program akan mengeluarkan semua data yang ditulis ke saluran.

Saluran baca sahaja digunakan untuk berkongsi struktur data

Penggunaan saluran baca sahaja yang paling biasa adalah untuk berkongsi struktur data untuk mengelakkan masalah akses serentak. Sebagai contoh, kita boleh menggunakan saluran baca sahaja untuk melaksanakan baris gilir selamat benang yang hanya boleh membaca data.

Berikut ialah contoh mudah yang menunjukkan cara menggunakan saluran baca sahaja untuk melaksanakan baris gilir selamat benang:

package main

import "fmt"

type Queue struct {
    roCh <-chan interface{}
}

func NewQueue(size int) *Queue {
    ch := make(chan interface{}, size)
    return &Queue{
        roCh: (<-chan interface{})(ch),
    }
}

func (q *Queue) Push(v interface{}) {
    ch := q.roCh.(chan<- interface{})
    ch <- v
}

func (q *Queue) Pop() interface{} {
    return <-q.roCh
}

func main() {
    q := NewQueue(10)
    for i := 0; i < 10; i++ {
        q.Push(i)
    }

    for i := 0; i < 10; i++ {
        fmt.Println(q.Pop())
    }
}
Salin selepas log masuk

Dalam contoh ini, kami melaksanakan baris gilir, di mana The Kaedah tolak digunakan untuk menambah elemen pada baris gilir, dan kaedah Pop digunakan untuk muncul dan mengembalikan elemen dalam baris gilir. Ambil perhatian bahawa baris gilir kami menggunakan saluran baca sahaja untuk berkongsi data, memastikan keselamatan akses serentak.

Ringkasan

Saluran baca sahaja ialah jenis khas dalam Golang, yang digunakan untuk menyekat gorout tertentu untuk hanya menerima operasi dan bukan menghantar operasi. Saluran baca sahaja boleh digunakan untuk melaksanakan struktur data kongsi baca sahaja untuk mengelakkan isu konkurensi. Saluran baca sahaja adalah jenis yang berbeza daripada saluran biasa dan saluran boleh tulis. Apabila menggunakan saluran baca sahaja, kita perlu berhati-hati untuk tidak melakukan operasi penghantaran pada saluran baca sahaja, jika tidak, ia akan menyebabkan ralat penyusunan.

Atas ialah kandungan terperinci Cara membuat saluran baca sahaja dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan