初级会员
  • 第 62039 位会员
  • GGXXLL
  • Trock
  • 2021-05-08 10:07:29
  • Offline
  • 29 44

最近发布的文章

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 求助,并查集实现
    第二个代码 `find` 少了 `n.stack = make([]int, 0)` ?
  • @leenzhu 确实。实际上即使起了 goroutine 调用 handle 了,也直接返回了,开销很小,所以不太懂为啥要限制这个呀。
  • ``` package main import ( "fmt" "net/http" "net/http/httptest" "time" "golang.org/x/time/rate" ) type LimiterOption struct { lm *rate.Limiter } func WithLimiter(duration time.Duration, count int) func(o *LimiterOption) { return func(o *LimiterOption) { o.lm = rate.NewLimiter(rate.Every(duration), count) } } // LimiterWrap 每个 handler 单独限制 func LimiterWrap(f http.HandlerFunc, opts ...func(o *LimiterOption)) http.HandlerFunc { o := &LimiterOption{ lm: rate.NewLimiter(rate.Every(100*time.Millisecond), 10), } for _, opt := range opts { opt(o) } return func(w http.ResponseWriter, r *http.Request) { if !o.lm.Allow() { w.WriteHeader(http.StatusInternalServerError) return } f(w, r) } } func xHandle(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello\n")) } func main() { // 单独控制一个接口 http.HandleFunc("/", LimiterWrap(xHandle, WithLimiter(100*time.Millisecond, 1))) // 所有接口都走同一个限流 // http.ListenAndServe(":8080", LimiterWrap(http.DefaultServeMux.ServeHTTP)) for i := 0; i < 10; i++ { w := httptest.NewRecorder() req, _ := http.NewRequest(http.MethodGet, "/", nil) http.DefaultServeMux.ServeHTTP(w, req) fmt.Println(i, w.Code) time.Sleep(time.Millisecond * 20) } //output //0 200 //1 500 //2 500 //3 500 //4 500 //5 200 //6 500 //7 500 //8 500 //9 500 } ```
  • `recover` 呀
  • 评论了主题 go新人求助一个问题
    @Neightly 你说话这么冲干啥?reflect 实现 Marshal 方法百度搜就有。我起码是回答问题,哪怕不好用,也确实是方法之一,有错吗?