Go 如果通过值传递请求,则http请求值为空

Go 如果通过值传递请求,则http请求值为空,go,Go,有人能解释一下这里发生了什么吗 package main import ( "fmt" "net/http" "strings" ) func Verify(req http.Request) string { return req.FormValue("g-recaptcha-response") } func main() { req, _ := http.NewRequest("POST", "http://www.google.com/sea

有人能解释一下这里发生了什么吗

package main

import (
    "fmt"
    "net/http"
    "strings"
)

func Verify(req http.Request) string {
    return req.FormValue("g-recaptcha-response")
}

func main() {
    req, _ := http.NewRequest("POST", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
        strings.NewReader("z=post&both=y&prio=2&empty="))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
    Verify(*req)
    fmt.Println(req.FormValue("z"))
}

这将产生一个空输出。 现在,如果我在将请求作为值传递之前访问z值,它就可以工作了

package main

import (
    "fmt"
    "net/http"
    "strings"
)

func Verify(req http.Request) string {
    return req.FormValue("g-recaptcha-response")
}

func main() {
    req, _ := http.NewRequest("POST", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
        strings.NewReader("z=post&both=y&prio=2&empty="))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
    Verify(*req)
    fmt.Println(req.FormValue("z"))
}

我尝试了从1.5到1.7的多个go版本,结果都是一样的。
如果请求是通过引用传递的,则它会按预期工作。

这是因为请求的主体是io.Reader,并且您只能从io.Reader读取一次,当您第二次尝试读取内容时,没有更多的数据可读取


方法FormValue调用ParseForm,它从读取器读取所有数据。

这是因为请求的主体是io.reader,您只能从io.reader读取一次,当您第二次尝试读取内容时,没有更多的数据可读取


方法FormValue调用ParseForm,并从读取器读取所有数据。

1。Go中没有通过引用。2.永远不要复制http.NET请求。3.仅使用*http.Request。我同意,但我使用的是一个lib。这并不能解释我所看到的:1。Go中没有通过引用。2.永远不要复制http.NET请求。3.仅使用*http.Request。我同意,但我使用的是一个lib。这并不能解释我所看到的:换句话说,在处理请求之前,您可以通过调用req.ParseForm以一种通用的方式解决这个问题。这就是我所寻找的。因此,为副本读取的正文对于原始请求不再可用,因此为空字符串。谢谢换句话说,您可以通过在对请求执行任何操作之前调用req.ParseForm,以一种通用的方式解决这个问题。这就是我一直在寻找的。因此,为副本读取的正文对于原始请求不再可用,因此为空字符串。谢谢