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

我刚刚开始学习GO并编写了这段代码,用于编写文件或文件,但我对它的语义不满意。http.Response.Bodyos.Stdout


我希望结构具有这些接收器功能,以便我可以在整个应用程序中更轻松地使用它。http.Response


我知道答案可能会被标记为固执己见,但我仍然想知道,有没有更好的方法来写这个?是否有某种最佳实践?


package main


import (

    "fmt"

    "io"

    "io/ioutil"

    "net/http"

    "os"

)


type httpResp http.Response


func 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.Get


func 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()


}

谢谢!


动漫人物
浏览 55回答 1
1回答

拉丁的传说

您不必实现这些功能。 已经实现了 io。作者:*http.Response以 HTTP/1.x 服务器响应格式写入 r 到 w,包括状态行、标头、正文和可选的尾部。package mainimport (    "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.Responsetype RespWrapper struct {    *http.Response}func (w *RespWrapper) toStdOut() {    _, err := io.Copy(os.Stdout, w.Body)    if err != nil {        panic(err)    }} 但是,您必须使用 构造一个类型的变量:RespWrapper*http.Responsefunc 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go