Go反射

作者: Bug2Coder | 来源:发表于2021-03-16 13:34 被阅读0次

    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)
    
    }
    

    相关文章

      网友评论

          本文标题:Go反射

          本文链接:https://www.haomeiwen.com/subject/bvarcltx.html