Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh membuat saluran Go yang boleh menerima nilai pelbagai jenis?

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

Linda Hamilton
Linda Hamiltonasal
2024-11-04 03:08:02855semak imbas

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>

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>

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!

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