从第二个 goroutine 写入 http 响应

Writing http response from an second goroutine

我一直在使用 spotify api 并遇到了一个问题。 context.Context 被使用,因此函数只是“随机”执行。 OAuth 函数应该检查代码是否无效,但如果我不使用通道执行此操作,代码的最后部分将直接执行,甚至 first/second 函数都没有完成。因此,我制作了第二个 goroutine 来检查是否接收到通道,然后写一个响应。但是现在我收到此错误 http: wrote more than the declared Content-Length 我该如何更正 Content-Lenght?为什么还要使用上下文?

我的代码:

// Wrapper: github.com/zmb3/spotify/v2

func WriteResponse(w http.ResponseWriter, h chan *spotify.Client) {

    client := <-h

    user, err := client.CurrentUser(context.Background())
    fmt.Println(user.User.DisplayName)
    if err != nil {
        _, err := fmt.Fprint(w, "Couldn't get user sorry :(")
        if err != nil {
            return
        }
    }
    _, err = fmt.Fprintf(w, "Logged in as %s!", user.User.DisplayName)
    if err != nil {
        log.Println(err)
        return
    }
}

func OAuth(w http.ResponseWriter, r *http.Request) {
    ch := make(chan *spotify.Client)

    tok, err := auth.Token(r.Context(), state, r)
    if err != nil {
        w.WriteHeader(503)
        _, err := fmt.Fprint(w, "Couldn't get token sorry :(")
        if err != nil {
            return
        }
    }

    if st := r.FormValue("state"); st != state {
        http.NotFound(w,r)
        log.Fatalf("State mismatch: %s != %s\n", st, state)
    }

    go WriteResponse(w, ch)
    client := spotify.New(auth.Client(r.Context(), tok))

    ch <- client
}

你忘了return..

if err != nil {
        w.WriteHeader(503)
        _, err := fmt.Fprint(w, "Couldn't get token sorry :(")
        if err != nil {
            return
        }
        // here
        return
    }