Rumah  >  Artikel  >  pembangunan bahagian belakang  >  penggunaan saluran golang

penggunaan saluran golang

王林
王林asal
2023-05-16 10:25:37616semak imbas

Golang ialah bahasa pengaturcaraan yang popular kerana kecekapan, keselamatan memori dan keselarasannya. Di Golang, komunikasi serentak boleh dicapai dengan mudah menggunakan saluran, yang juga merupakan salah satu kelebihan utama Golang. Artikel ini akan memberikan pengenalan yang mendalam tentang konsep asas, penggunaan dan beberapa teknik saluran di Golang.

  1. Apakah itu saluran

Di Golang, saluran ialah struktur data yang digunakan untuk komunikasi Goroutine. Ia boleh ditimbal atau tidak ditimbal. Saluran tidak buffer ialah saluran segerak yang menyekat kedua-dua penghantaran dan penerimaan data. Apabila data yang dihantar tidak diterima, operasi penghantaran akan disekat sehingga Goroutine menerima data tersebut. Begitu juga, apabila penerima tidak bersedia untuk menerima data, operasi terima akan disekat. Saluran penimbal membenarkan data dihantar dan diterima sebelum penimbal penuh, dan kapasiti penimbal ialah saiz yang ditentukan apabila saluran dibuat.

saluran boleh ditakrifkan dan dimulakan dengan cara berikut:

var ch chan int // 定义一个 int 类型的 channel

ch = make(chan int) // 初始化 channel

ch := make(chan int) // 定义并初始化 channel
  1. Penggunaan saluran

Di Golang, apabila menggunakan saluran, ia biasanya melibatkan berikut Dua operasi:

  • Hantar data
  • Terima data

Sintaks asas untuk menghantar data melalui saluran:

ch <- data  // 将 data 发送到 channel ch 上

Terima melalui saluran Sintaks asas data:

data := <- ch // 从 channel ch 中接收数据,并将其赋值给变量 data

Nota: Operasi penerimaan akan disekat sehingga data dihantar ke saluran Jika saluran telah ditutup dan tiada data di dalamnya, operasi penerimaan akan kembali serta-merta dan menetapkan a nilai sifar kepada pembolehubah penerima.

Berikut ialah contoh mudah:

package main

import "fmt"

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

    for i := range ch {
        fmt.Println("Received:", i)
        if i == 10 {
            break
        }
    }
}

func sendData(ch chan int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // 关闭 channel
}

Dalam contoh di atas, kami mentakrifkan fungsi sendDate untuk menghantar data ke ch. Dalam fungsi utama, kami mencipta saluran dan menggunakan kaedah julat untuk menerima data daripada saluran satu demi satu. Apabila data yang diterima ialah 10, kami keluar dari gelung dan menutup saluran.

  1. Ciri-ciri menyekat saluran

Di Golang, saluran ialah struktur data yang menyekat, yang bermaksud apabila Goroutine cuba menghantar data ke saluran penuh atau Mereka disekat apabila menerima data daripada saluran kosong. Ini membantu memastikan penyegerakan dan kerjasama antara Goroutines.

Seterusnya, kami akan menunjukkan ciri menyekat saluran melalui contoh:

package main

import "fmt"

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

    ch <- 1 // 发送数据
    ch <- 2

    fmt.Println(<-ch) // 接收数据
    fmt.Println(<-ch)

    ch <- 3
    fmt.Println("数据已经被发送,但是没有接收方")
}

Dalam contoh ini, kami mencipta saluran dengan saiz penimbal 2 dan cuba menghantar 3 data kepadanya. Dua data pertama boleh dihantar kerana penimbal belum penuh. Tetapi apabila kami cuba menerima data ini, kami perlu menunggu penerima setiap data satu persatu sebelum kami boleh meneruskan penghantaran. Pada percubaan ketiga untuk menghantar data ke saluran, penghantar akan disekat kerana tiada penerima.

  1. Penutupan saluran

Di Golang, saluran boleh ditutup melalui kaedah tutup. Saluran tertutup akan mengembalikan nilai sifar apabila diterima dan tidak akan disekat Ini membolehkan penerima menentukan dengan tepat sama ada saluran telah ditutup selepas menerima data.

Berikut ialah contoh:

package main

import "fmt"

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

    go sendData(ch)

    for i := range ch {
        fmt.Println("Received:", i)
    }
}

func sendData(ch chan int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // 关闭 channel
}

Dalam contoh ini, apabila fungsi sendDate telah selesai menghantar data, ia akan menggunakan kaedah tutup untuk menutup saluran. Dalam fungsi utama, kami menggunakan kaedah julat untuk menerima data yang dihantar dari saluran apabila tiada data dalam saluran, kaedah julat akan keluar dari gelung.

  1. Pemilih saluran

Selain operasi saluran asas di atas, Golang juga menyediakan pemilih (pilihan) yang boleh digunakan antara pilihan berbilang saluran. Ini berguna untuk mengendalikan operasi hantar dan terima pada berbilang saluran.

Berikut ialah contoh:

package main

import (
    "fmt"
    "time"
)

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

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- 1
    }()

    go func() {
        time.Sleep(5 * time.Second)
        ch2 <- 2
    }()

    for i := 0; i < 2; i++ {
        select {
        case <-ch1:
            fmt.Println("Received from ch1")
        case <-ch2:
            fmt.Println("Received from ch2")
        }
    }
}

Dalam contoh ini, kami mentakrifkan dua saluran. Hantar data ke saluran selepas kelewatan 2 saat dan 5 saat masing-masing dalam dua Goroutine. Kemudian, dalam fungsi utama, kami menggunakan kaedah pilih untuk mendengar kedua-dua saluran. Apabila terdapat data dalam saluran, kaedah pilih akan bertindak balas.

  1. Ringkasan

Di Golang, saluran ialah alat yang sangat berkuasa dan mudah digunakan. Melalui saluran, kami boleh mencapai komunikasi dan penyegerakan antara Goroutines, dengan itu meningkatkan prestasi keselarasan program. Artikel ini memperkenalkan konsep asas, penggunaan dan beberapa teknik saluran, dengan harapan dapat membantu pembaca lebih memahami cara menggunakan saluran untuk membina program serentak yang boleh dipercayai.

Atas ialah kandungan terperinci penggunaan saluran golang. 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
Artikel sebelumnya:pelaksanaan pelayan golangArtikel seterusnya:pelaksanaan pelayan golang