Go反射

2021-03-16  本文已影响0人  Bug2Coder

1、chan类型

package main
import (
  "fmt"
  "os"
  "os/single"
  "reflect"
  "syscall"
)

func refelectChan(ch interface{}, value interface{}) {
    // 判断是否为通道类型
    if reflect.ValueOf(ch).Kind() == reflect.Chan {
        // 发送者
        go func(value interface{}) {
            defer func() {
                fmt.Println("exit-send")
            }()
            // 判断发送的消息是否符合通道类型
            if reflect.ValueOf(value).Type().String() == reflect.ValueOf(ch).Type().Elem().String() {
                // 向通道内发送消息
                reflect.ValueOf(ch).Send(reflect.ValueOf(value))
                time.Sleep(time.Second * 5)
                // 关闭通道
                reflect.ValueOf(ch).Close()
            } else {
                fmt.Println("类型不符合通道定义")
                return
            }

        }(value)
        // 接收者
        go func() {
            defer func() {
                fmt.Println("exit-recv")
            }()
            for {
                // 接收消息,通道关闭ok为false
                msg, ok := reflect.ValueOf(ch).Recv()
                if ok {
                    fmt.Println(msg)
                } else {
                    fmt.Println("通道已关闭")
                    return
                }
            }
        }()

    } else {
        fmt.Println("不是通道类型")
        return
    }
}
func mian(){
    var a interface{}
    a = make(chan struct{})
    refelectChan(a, struct{}{})
    // 监听程序退出信号,关闭服务后退出
    ch := make(chan os.Signal, 1)
    signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
    sig := <-ch
    fmt.Println("退出", sig)

}
上一篇下一篇

猜你喜欢

热点阅读