为了账号安全,请及时绑定邮箱和手机立即绑定

语义方式Go 中的响应接收器函数

语义方式Go 中的响应接收器函数

Go
动漫人物 2022-10-04 15:59:33
我刚刚开始学习GO并编写了这段代码,用于编写文件或文件,但我对它的语义不满意。http.Response.Bodyos.Stdout我希望结构具有这些接收器功能,以便我可以在整个应用程序中更轻松地使用它。http.Response我知道答案可能会被标记为固执己见,但我仍然想知道,有没有更好的方法来写这个?是否有某种最佳实践?package mainimport (    "fmt"    "io"    "io/ioutil"    "net/http"    "os")type httpResp http.Responsefunc main() {    res, err := http.Get("http://www.stackoverflow.com")    if err != nil {        fmt.Println("Error: ", err)        os.Exit(1)    }    defer res.Body.Close()    response := httpResp(*res)    response.toFile("stckovrflw.html")    response.toStdOut()}func (r httpResp) toFile(filename string) {    str, err := ioutil.ReadAll(r.Body)    if err != nil {        panic(err)    }    ioutil.WriteFile(filename, []byte(str), 0666)}func (r httpResp) toStdOut() {    _, err := io.Copy(os.Stdout, r.Body)    if err != nil {        panic(err)    }}顺便说一句,有没有办法让该方法吐出一个已经可以访问这些接收器函数的自定义类型,而无需强制转换?所以我可以做这样的事情:http.Getfunc main() {    res, err := http.Get("http://www.stackoverflow.com")    if err != nil {        fmt.Println("Error: ", err)        os.Exit(1)    }    defer res.Body.Close()    res.toFile("stckovrflw.html")    res.toStdOut()}谢谢!
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您不必实现这些功能。 已经实现了 io。作者*http.Response

以 HTTP/1.x 服务器响应格式写入 r 到 w,包括状态行、标头、正文和可选的尾部。

package main


import (

    "net/http"

    "os"

)


func main() {

    r := &http.Response{}

    r.Write(os.Stdout)

}

在上面的示例中,零值打印:

HTTP/0.0 000 状态代码 0

内容长度: 0

游乐场: https://play.golang.org/p/2AUEAUPCA8j


如果在编写方法中需要其他业务逻辑,则可以嵌入到定义的类型中:*http.Response

type RespWrapper struct {

    *http.Response

}


func (w *RespWrapper) toStdOut() {

    _, err := io.Copy(os.Stdout, w.Body)

    if err != nil {

        panic(err)

    }

但是,您必须使用 构造一个类型的变量:RespWrapper*http.Response


func main() {

    // resp with a fake body

    r := &http.Response{Body: io.NopCloser(strings.NewReader("foo"))}

    // or r, _ := http.Get("example.com")


    // construct the wrapper

    wrapper := &RespWrapper{Response: r}

    wrapper.toStdOut()

}

有没有办法使网址。获取方法吐出自定义类型

不可以,返回类型是 ,这是函数签名的一部分,您无法更改它。http.Get(resp *http.Response, err error)


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信