我想解析 Web 请求的响应,但在将其作为字符串访问时遇到了问题。
func main() { resp, err := http.Get("http://google.hu/") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) ioutil.WriteFile("dump", body, 0600) for i:= 0; i < len(body); i++ { fmt.Println( body[i] ) // This logs uint8 and prints numbers } fmt.Println( reflect.TypeOf(body) ) fmt.Println("done") }
如何以字符串形式访问响应?ioutil.WriteFile将响应正确写入文件。
ioutil.WriteFile
我已经检查了包参考,但它并没有真正的帮助。
bs := string(body)应该足以给你一个字符串。
bs := string(body)
从那里,您可以将其用作常规字符串。
有点像这个线程 (在Go 1.16 – Q1 2021 – ioutildeprecation : ioutil.ReadAll()=>之后更新io.ReadAll()):
ioutil
ioutil.ReadAll()
io.ReadAll()
var client http.Client resp, err := client.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() if resp.StatusCode == http.StatusOK { bodyBytes, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } bodyString := string(bodyBytes) log.Info(bodyString) }
另请参阅GoByExample。
如下所述(以及回答中),这是一种转换 (参见规范)。 请参阅“有多贵[]byte(string)? ”(相反的问题,但同样的结论适用)其中提到:
[]byte(string)
一些转换与强制转换相同,例如uint(myIntvar),它只是重新解释到位的位。 补充道: 用字节片制作字符串,肯定涉及在堆上分配字符串。不变性属性迫使这一点。 有时您可以通过使用 []byte 做尽可能多的工作然后在最后创建一个字符串来进行优化。该bytes.Buffer类型通常很有用。
一些转换与强制转换相同,例如uint(myIntvar),它只是重新解释到位的位。 补充道:
uint(myIntvar)
用字节片制作字符串,肯定涉及在堆上分配字符串。不变性属性迫使这一点。 有时您可以通过使用 []byte 做尽可能多的工作然后在最后创建一个字符串来进行优化。该bytes.Buffer类型通常很有用。
bytes.Buffer