golang event meassage driver framework

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuliuzi_hz/article/details/78962971
package main
import (
    "fmt"
    "strings"
    "runtime"
    "time"
)

type ChangeMessage struct {
	MessageId string
	MessageType string
	Value       int
}

type HandleFunc struct{
	filterFunc func(string) bool
	handFunc   func(ChangeMessage) error
}
type HandleMap struct{
	HandFuncList []HandleFunc
}

func (h *HandleMap)register( f HandleFunc){
    h.HandFuncList = append(h.HandFuncList, f)
}

func messageHandle(mChan chan ChangeMessage,hm HandleMap){
	for {
		select{
			case event:=<-mChan:
				fmt.Println("chan pop one element",event)
				for _,v:=range hm.HandFuncList{
					if v.filterFunc(event.MessageType){
						err:=v.handFunc(event)
						if err!=nil{
							fmt.Println("error")
						}
					}
				}
				fmt.Println("finish mChan")				
		}
	}
}

func filter1(MessageType string) bool {
	return strings.Contains(MessageType, "a1")
}

func handle1(c ChangeMessage) error {
	fmt.Println("finsh handle1 for message ",c)
	return nil
}

func filter2(MessageType string) bool {
	return strings.Contains(MessageType, "a2")
}

func handle2(c ChangeMessage) error {
	fmt.Println("finsh handle2 for message ",c)
	return nil
}

func filter3(MessageType string) bool {
	return strings.Contains(MessageType, "a3")
}

func handle3(c ChangeMessage) error {
	fmt.Println("finsh handle3 for message ",c)
	return nil
}


func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())	

	hm:=HandleMap{}
	hm.register(HandleFunc{filter1,handle1})
	hm.register(HandleFunc{filter2,handle2})
	fmt.Println(hm)

	mChan := make(chan ChangeMessage )
	go messageHandle(mChan,hm)
	mChan<-ChangeMessage{"123","aa",2}
	mChan<-ChangeMessage{"121","a1a2",3}
	mChan<-ChangeMessage{"121","a1",3}
	mChan<-ChangeMessage{"121","a2",3}
	mChan<-ChangeMessage{"121","a3",3}
}

猜你喜欢

转载自blog.csdn.net/liuliuzi_hz/article/details/78962971