package main import "fmt" func main() { // 實例化一個角色 a := new(Actor) // 註冊名爲OnSkill的回調 RegisterEvent("OnSkill", a.OnEvent) // 再次在OnSkill上註冊全局事件 RegisterEvent("OnSkill", GlobalEvent) // 調用事件,全部註冊的同名函數都會被調用 CallEvent("OnSkill", 100) } // 聲明角色的結構體 type Actor struct { } // 爲角色添加一個事件處理函數 func (a *Actor) OnEvent(param interface{}) { fmt.Println("actor event:", param) } // 全局事件 func GlobalEvent(param interface{}) { fmt.Println("global event:", param) } // 實例化一個經過字符串映射函數切片的map var eventByName = make(map[string][]func(interface{})) // 註冊事件,提供事件名和回調函數 func RegisterEvent(name string, callback func(interface{})) { // 經過名字查找事件列表 list := eventByName[name] // 在列表切片中添加函數 list = append(list, callback) // 將修改的事件列表切片保存回去 eventByName[name] = list } // 調用事件 func CallEvent(name string, param interface{}) { // 經過名字找到事件列表 list := eventByName[name] // 遍歷這個事件的全部回調 for _, callback := range list { // 傳入參數調用回調 callback(param) } }