Go编程 利用键盘输入模块做生产-消费测试

小结:

var cmd = make(chan byte)
// cmd := make(chan byte)

eventhandle(uint16(t)) //强转

//定义函数指针 type dowhat func()

//定义结构体
type event struct {
    Type uint16
    Func dowhat
}

//var q [3]int = [3]int{1, 2, 3}//对的
//var q [3]int = {1, 2, 3}//不对必须强转
var eventbank [2]event = [2]event{{1, aa}, {2, bb}}

RegisterEvent(2, []func(interface{}){bb})


var eventbank = make(map[uint16]func(interface{}))

做一个无限表 KEY是u16 V是一个函数 这个函数传参是interface 没有返回值

调用函数是

eventbank[id](param)


 

前面完成了键盘生产消息

现在练习一下 Go的编程

准备做一个生产-消费的练笔

1---消费者是数组

package main

import (
	"fmt"
	"runtime"
	"time"

	Q "XX/terminal"
)

var cmd = make(chan byte)
// cmd := make(chan byte)

func keyboard() {
	Q.Configure()
	defer Q.Restore()
	for {
		c := Q.Getchar()
		if c == 10 { //WIN10按回车健 输入 就是10
			continue
		}
		fmt.Printf("INPUT-%d-%c\r\n", c, c)
		cmd <- (c - 48)
	}

}
func main() {
	fmt.Println("start")
	go keyboard() //生产
	for {//消费
		select {
		case t := <-cmd:
			eventhandle(uint16(t)) //强转
		case <-time.After(time.Second*5):
			fmt.Println("timeout")
		}
	}
}

//定义函数指针
type dowhat func()

//定义结构体
type event struct {
	Type uint16
	Func dowhat
}

//随便写2个函数
func aa() {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
}
func bb() {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
}

//完成一个全部bank
//var q [3]int = [3]int{1, 2, 3}//对的
//var q [3]int = {1, 2, 3}//不对必须强转
var eventbank [2]event = [2]event{{1, aa}, {2, bb}}
//查找执行
func eventhandle(Type uint16) {
	for i := 0; i < len(eventbank); i++ {
		if Type == eventbank[i].Type {
			eventbank[i].Func()
			break
		}
	}
}

测试键盘按下 1 2 可以启动对应的菜单函数

它的特点是 数组里面可以自己再扩展成员!!!

数组是需要从头到尾去找的

能不能不要找?

可以的 map

package main

import (
	"fmt"
	"runtime"
	"time"

	Q "XX/terminal"
)

var cmd = make(chan byte)

// cmd := make(chan byte)

func keyboard() {
	Q.Configure()
	defer Q.Restore()
	for {
		c := Q.Getchar()
		if c == 10 { //WIN10按回车健 输入 就是10
			continue
		}
		fmt.Printf("INPUT-%d-%c\r\n", c, c)
		cmd <- (c - 48)
	}

}
func main() {
	fmt.Println("start")
	go keyboard() //生产
	RegisterEvent(1, aa)
	RegisterEvent(2, bb)

	for {
		select {
		case t := <-cmd:
			eventhandle(uint16(t), "HELLO") //强转
		case <-time.After(time.Second * 5):
			fmt.Println("timeout")
		}
	}
}

//随便写2个函数
func aa(param interface{}) {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
	fmt.Println("actor event:", param)
}
func bb(param interface{}) {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
	fmt.Println("actor event:", param)
}

//完成一个全部bank

var eventbank = make(map[uint16]func(interface{}))

//用户自己挂进去注册
func RegisterEvent(id uint16, callback func(interface{})) {
	eventbank[id] = callback
}

func eventhandle(id uint16, param interface{}) {
	eventbank[id](param)
}

他需要自己防错 只能进去 1 2  其他我没有写

可不可以一个输入 调用N个函数 

可以的 用函数数组

需要强转

输入1可以调用2个函数

输入2可以调用1个函数

package main

import (
	"fmt"
	"runtime"
	"time"

	Q "XX/terminal"
)

var cmd = make(chan byte)

// cmd := make(chan byte)

func keyboard() {
	Q.Configure()
	defer Q.Restore()
	for {
		c := Q.Getchar()
		if c == 10 { //WIN10按回车健 输入 就是10
			continue
		}
		fmt.Printf("INPUT-%d-%c\r\n", c, c)
		cmd <- (c - 48)
	}

}
func main() {
	fmt.Println("start")
	go keyboard() //生产
	RegisterEvent(1, []func(interface{}){aa, bb})
	RegisterEvent(2, []func(interface{}){bb})

	for {
		select {
		case t := <-cmd:
			eventhandle(uint16(t), "HELLO") //强转
		case <-time.After(time.Second * 5):
			fmt.Println("timeout")
		}
	}
}

//随便写2个函数
func aa(param interface{}) {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
	fmt.Println("actor event:", param)
}
func bb(param interface{}) {
	funcName, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())
		fmt.Printf("file: %s, line: %d\n", file, line)
	}
	fmt.Println("actor event:", param)
}

//完成一个全部bank

var eventbank = make(map[uint16][]func(interface{}))

//用户自己挂进去注册
func RegisterEvent(id uint16, callback []func(interface{})) {
	eventbank[id] = callback
}

func eventhandle(id uint16, param interface{}) {
	for _, callback := range eventbank[id] {
		callback(param)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值