package mux import ( "fmt" "net/http" "sort" "strconv" "time" ) type connLog struct { startTime time.Time isClose bool logs []string } var m map[int]*connLog var copyMap map[int]*connLog var stashTimeNow time.Time func deepCopyMap() { stashTimeNow = time.Now() copyMap = make(map[int]*connLog) for k, v := range m { copyMap[k] = &connLog{ startTime: v.startTime, isClose: v.isClose, logs: v.logs, } } } func init() { m = make(map[int]*connLog) m[0] = &connLog{ startTime: time.Now(), isClose: false, logs: []string{"111", "222", "333"}, } m[1] = &connLog{ startTime: time.Now(), isClose: false, logs: []string{"111", "222", "333", "444"}, } m[2] = &connLog{ startTime: time.Now(), isClose: true, logs: []string{"111", "222", "333", "555"}, } } type IntSlice []int func (s IntSlice) Len() int { return len(s) } func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] } func NewLogServer() { http.HandleFunc("/", index) http.HandleFunc("/detail", detail) http.HandleFunc("/stash", stash) fmt.Println(http.ListenAndServe(":8899", nil)) } func stash(w http.ResponseWriter, r *http.Request) { deepCopyMap() w.Write([]byte("ok")) } func index(w http.ResponseWriter, r *http.Request) { var keys []int for k := range copyMap { keys = append(keys, k) } sort.Sort(IntSlice(keys)) var s string for v := range keys { connL := copyMap[v] s += "" + strconv.Itoa(v) + "----------" s += strconv.Itoa(int(stashTimeNow.Unix()-connL.startTime.Unix())) + "s----------" s += strconv.FormatBool(connL.isClose) s += "
" } w.Write([]byte(s)) } func detail(w http.ResponseWriter, r *http.Request) { id := r.FormValue("id") i, _ := strconv.Atoi(id) v, _ := copyMap[i] var s string for _, vv := range v.logs { s += "

" + vv + "

" } w.Write([]byte(s)) }