1、chan類型
package main
import (
"fmt"
"os"
"os/single"
"reflect"
"syscall"
)
func refelectChan(ch interface{}, value interface{}) {
// 判斷是否為通道類型
if reflect.ValueOf(ch).Kind() == reflect.Chan {
// 發(fā)送者
go func(value interface{}) {
defer func() {
fmt.Println("exit-send")
}()
// 判斷發(fā)送的消息是否符合通道類型
if reflect.ValueOf(value).Type().String() == reflect.ValueOf(ch).Type().Elem().String() {
// 向通道內(nèi)發(fā)送消息
reflect.ValueOf(ch).Send(reflect.ValueOf(value))
time.Sleep(time.Second * 5)
// 關(guān)閉通道
reflect.ValueOf(ch).Close()
} else {
fmt.Println("類型不符合通道定義")
return
}
}(value)
// 接收者
go func() {
defer func() {
fmt.Println("exit-recv")
}()
for {
// 接收消息,通道關(guān)閉ok為false
msg, ok := reflect.ValueOf(ch).Recv()
if ok {
fmt.Println(msg)
} else {
fmt.Println("通道已關(guān)閉")
return
}
}
}()
} else {
fmt.Println("不是通道類型")
return
}
}
func mian(){
var a interface{}
a = make(chan struct{})
refelectChan(a, struct{}{})
// 監(jiān)聽程序退出信號,關(guān)閉服務(wù)后退出
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
sig := <-ch
fmt.Println("退出", sig)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。