Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh membuat saluran Go yang boleh menerima nilai pelbagai jenis?
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!