Rumah > pembangunan bahagian belakang > Golang > barisan pelaksanaan saluran paip golang

barisan pelaksanaan saluran paip golang

WBOY
Lepaskan: 2023-05-10 09:13:36
asal
519 orang telah melayarinya

Dalam bahasa Go, saluran ialah struktur data yang sangat berkuasa. Ia boleh digunakan untuk komunikasi dan penyegerakan antara coroutine, tetapi dalam pembangunan sebenar, kita biasanya hanya menggunakan fungsi asasnya. Dalam artikel ini, saya akan menunjukkan kepada anda cara melaksanakan struktur data baris gilir menggunakan paip.

  1. Konsep asas saluran paip

Pipeline ialah primitif serentak dalam bahasa Go, digunakan untuk penghantaran data dan penyegerakan antara coroutine. Ia direka bentuk sebagai kaedah penghantaran data menyekat, iaitu semasa operasi penghantaran dan penerimaan, coroutine penghantaran dan penerimaan akan disekat sehingga operasi pihak lain selesai sebelum meneruskan ke operasi seterusnya.

Dalam bahasa Go, anda boleh menggunakan fungsi make() untuk membuat saluran paip Terdapat dua jenis saluran paip: buffered dan unbuffered. Paip buffered boleh menyimpan sejumlah data, manakala paip unbuffered hanya boleh menghantar dan menerima pada masa yang sama.

Berikut ialah cara untuk mentakrifkan paip jenis rentetan tidak buffer:

ch := make(chan string)
Salin selepas log masuk
  1. Konsep asas baris gilir

Baris gilir ialah struktur data biasa yang menguruskan data mengikut prinsip first-in-first-out (FIFO). Barisan gilir boleh menambah data pada satu hujung baris gilir dan memadam data pada hujung yang lain. Operasi sisipan juga dipanggil enqueue, dan operasi pemadaman juga dipanggil dequeue.

Dalam bahasa Go, kita boleh menggunakan kepingan untuk melaksanakan struktur data baris gilir. Untuk operasi enqueuing dan dequeuing, anda boleh menggunakan fungsi append() dan operasi pemotongan hirisan.

Berikut ialah cara untuk menentukan baris gilir jenis rentetan:

queue := []string{}
Salin selepas log masuk
  1. Idea ​​paip untuk melaksanakan baris gilir

Kini kami mempunyai asas paip dan barisan Sekarang setelah kita mempunyai pemahaman tertentu tentang konsep, kita boleh mula memikirkan cara menggunakan saluran paip untuk melaksanakan baris gilir.

Pertama, kita perlu menentukan paip jenis rentetan buffer dan menggunakan coroutine untuk memantau paip ini secara berterusan. Apabila terdapat data dalam saluran paip, kita perlu menambahnya pada baris gilir, jika tidak, kita akan terus menunggu.

Kedua, kita perlu mentakrifkan dua fungsi - enqueue dan dequeue. Dalam fungsi enqueue, kami menghantar rentetan input ke paip dan menunggu coroutine mendengar menambahnya pada baris gilir. Dalam fungsi dequeue, kita dequeue elemen pertama baris gilir dan mengembalikan nilainya. Jika baris gilir kosong, rentetan kosong dikembalikan.

Akhir sekali, kami perlu menulis program ujian mudah untuk mengesahkan sama ada pelaksanaan kami betul.

Berikut ialah kod khusus untuk proses pelaksanaan:

package main

import "fmt"

func main() {
    q := NewQueue()

    q.Enqueue("Hello")
    q.Enqueue("World")
    q.Enqueue("Golang")

    fmt.Println(q.Dequeue())
    fmt.Println(q.Dequeue())
    fmt.Println(q.Dequeue())
}

func NewQueue() *Queue {
    // 创建一个带缓冲的字符串类型管道
    ch := make(chan string, 100)

    // 启动一个协程持续监听管道
    go func() {
        for s := range ch {
            // 将管道中的字符串加入到队列中
            queue = append(queue, s)
        }
    }()

    return &Queue{ch: ch}
}

// 全局队列变量
var queue []string

type Queue struct {
    ch chan string
}

func (q *Queue) Enqueue(s string) {
    q.ch <- s
}

func (q *Queue) Dequeue() string {
    if len(queue) == 0 {
        return ""
    }

    s := queue[0]
    queue = queue[1:]

    return s
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mencipta paip jenis rentetan penimbal dan memulakan coroutine untuk mendengar paip ini. Dalam coroutine, apabila terdapat rentetan dalam paip, kami menambahnya pada baris gilir.

Dalam fungsi NewQueue(), kami melaksanakan baris gilir menggunakan paip dan mengembalikan penunjuk baris gilir. Dalam fungsi Enqueue(), kami menghantar rentetan input ke dalam paip. Dalam fungsi Dequeue(), kami mengalih keluar elemen pertama baris gilir dan mengembalikan nilainya. Jika baris gilir kosong, rentetan kosong dikembalikan.

Akhir sekali, kami menulis program ujian mudah untuk menguji sama ada pelaksanaan baris gilir kami betul.

  1. Ringkasan

Dalam artikel ini, saya memperkenalkan cara menggunakan paip untuk melaksanakan struktur data baris gilir. Menggunakan saluran paip boleh melaksanakan fungsi baris gilir dengan lebih ringkas dan cekap, serta mempunyai prestasi konkurensi yang baik, yang sangat sesuai untuk persekitaran pembangunan bahasa Go. Saya harap artikel ini dapat membantu pemula memahami dengan lebih baik konsep saluran paip dan baris gilir dalam bahasa Go, dan juga boleh memberikan beberapa idea untuk menyelesaikan masalah yang dihadapi dalam pembangunan sebenar.

Atas ialah kandungan terperinci barisan pelaksanaan saluran paip 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