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