Go反射

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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容