Bagaimanakah saya boleh membuat saluran Go yang boleh menerima nilai pelbagai jenis?

Linda Hamilton
Lepaskan: 2024-11-04 03:08:02
asal
792 orang telah melayarinya

How can I create Go channels that can accept values of multiple different types?

Saluran Jenis-Agnostik dalam Go

Saluran dalam Go ialah mekanisme komunikasi yang berkuasa yang membolehkan goroutine menghantar dan menerima data. Dalam kebanyakan kes, saluran digunakan untuk menyampaikan nilai jenis tertentu. Walau bagaimanapun, adalah mungkin untuk mencipta saluran yang boleh menerima berbilang jenis yang berbeza.

Pertimbangkan contoh berikut:

<code class="go">package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan interface{})
    go func() {
        for {
            select {
            case p := <-ch:
                fmt.Printf("Received a %q\n", reflect.TypeOf(p).Name())
            case <-time.After(time.Second):
                fmt.Println("Empty Loop")
                return
            }
        }
    }()
    ch <- "Hello"
    time.Sleep(time.Second)
    ch <- 123
    time.Sleep(time.Second)
    ch <- struct{}{}
    time.Sleep(time.Second)
    ch <- []string{"Go", "programming"}
    time.Sleep(time.Second)
}</code>
Salin selepas log masuk

Kod ini mencipta saluran antara muka jenis chan{} yang boleh menerima sebarang jenis nilai. Apabila goroutine menerima nilai pada saluran, ia menggunakan pantulan untuk menentukan jenis nilai dan mencetaknya.

Anda juga boleh menggunakan suis jenis untuk mengendalikan pelbagai jenis nilai pada saluran, seperti yang ditunjukkan di bawah:

<code class="go">package main

import (
    "fmt"
    "reflect"
    "time"
)

func main() {
    ch := make(chan interface{})
    go func() {
        for {
            select {
            case p := <-ch:
                switch p := p.(type) {
                case string:
                    fmt.Printf("Got a string %q\n", p)
                case int:
                    fmt.Printf("Got an int %d\n", p)
                case struct{}:
                    fmt.Println("Got an empty struct")
                case []string:
                    fmt.Printf("Got a slice of strings %+v\n", p)
                default:
                    fmt.Printf("Type of p is %T. Value %v\n", p, p)
                }
            case <-time.After(time.Second):
                fmt.Println("Empty Loop")
                return
            }
        }
    }()
    ch <- "Hello"
    time.Sleep(time.Second)
    ch <- 123
    time.Sleep(time.Second)
    ch <- struct{}{}
    time.Sleep(time.Second)
    ch <- []string{"Go", "programming"}
    time.Sleep(time.Second)
}</code>
Salin selepas log masuk

Contoh ini menunjukkan cara anda boleh menggunakan suis jenis untuk mengendalikan pelbagai jenis nilai pada saluran.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membuat saluran Go yang boleh menerima nilai pelbagai jenis?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!