我剛剛開始學習GO,并寫了這段代碼,將一個http.Response.Body寫到os.Stdout或一個檔案中,但我對這個語意不滿意。
我希望 http.Response 結構擁有這些接收器函式,這樣我就可以在整個應用程式中更容易地使用它。
我知道答案可能會被標記為意見不一,但我仍然想知道,是否有更好的撰寫方式? 是否有某種最佳實踐?
package main
import (
"fmt"/span>
"io"/span>
"io/ioutil"
"net/http"/span>
"os"/span>
)
type httpResp http.Response
func main() {
res, err := http.Get("http://www.stackoverflow.com"/span>)
if err != nil {
fmt.Println("Error: "/span>, err)
os.Exit(1)
}
defer res.Body.Close()
response := httpResp(*res)
response.toFile("stckovrflw.html"/span>)
response.toStdOut()
}
func (r httpResp) toFile (r httpResp) title">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"/span>)
if err != nil {
fmt.Println("Error: "/span>, err)
os.Exit(1)
}
defer res.Body.Close()
res.toFile("stckovrflw.html")
res.toStdOut()
}
謝謝!
uj5u.com熱心網友回復:
你不需要實作這些函式。*http.Response已經實作了io.Writer:
Write以HTTP/1.x服務器回應格式將r寫入w,包括狀態行、頭資訊、正文和可選的預告片。
package main
import (
"net/http"/span>
"os"/span>
)
func main() {
r := &http.Response{}。
r.Write(os.Stdout)
}
在上面的例子中,零值的列印:
HTTP/0.0 000 狀態代碼 0
Content-Length: 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)
}
但是,你必須用*http.Response構建一個RespWrapper型別的變數:
func main() {
// resp with a fake body
r := &http.Response{Body: io.NopCloser(strings.NewReader("foo")) }
// or r, _ := http.Get("example.com")
//構建包裝器。
wrapper := &RespWrapper{Response: r}。
wrapper.toStdOut()
}
是否有辦法讓http.Get方法吐出一個自定義型別
不,
http.Get的回傳型別是(resp *http.Response, err error),這是函式簽名的一部分,你不能改變它。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329375.html
標籤:
