使用golang实现类java的netty异步通信编程,也即是回调通知基于事件的模型设计
代码
package main
import (
"encoding/json"
"fmt"
"net/http"
"sync"
)
var dirEngineChan sync.Map
func main() {
dHandler := dagHandler{}
http.Handle("/v1/dagScan", dHandler)
cHandler := callbackHandler{}
http.Handle("/v1/callback", cHandler)
http.ListenAndServe(":8080", nil)
}
type callbackHandler struct{}
func (h callbackHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
}
type dagHandler struct{}
func (h dagHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
dag := `{
"345": [
{
"f": "5"
},
{
"a": "2",
"w": "4"
},
{
"p": "5"
}
]
}`
go dagScan(dag)
failStr := "message"
data := []byte(failStr)
res.WriteHeader(200)
res.Write(data)
}
func dagScan(dag string) {
var m map[string][]map[string]string
json.Unmarshal([]byte(dag), &m)
dagChan := make(chan interface{})
for dirID, engineIpList := range m {
for _, engineIpMap := range engineIpList {
var chanList []interface{}
for engine, ip := range engineIpMap {
dirEngineChan.Store(dirID+engine, dagChan)
resultChan, _ := dirEngineChan.Load(dirID + engine)
chanList = append(chanList, resultChan)
fmt.Println(dirID)
fmt.Println(engine)
fmt.Println(ip)
}
for _, readChan := range chanList {
dirEngineResult := <-readChan.(chan interface{})
if dirEngineResult != "ok" {
//del chan
//del the element key dirID+engine of map
fmt.Println("del the element key dirID+engine of map")
}
}
fmt.Println()
fmt.Println()
}
}
//all done
//del chan
//del the key dirID+engine element of map
//del the element of table vs_dirs
fmt.Println("del the element of table vs_dirs")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?