小结:
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)
}
}