指针与值。

我有点想知道为什么下面的代码确实有效:


var serverStartedTime time.Time // Holds the time since the server is started.


type ServerInformation struct {

    Uptime ServerUptimeInformation `json:"uptime"`

}


type ServerUptimeInformation struct {

    Hours       int64 `json:"hours"`

    Minutes     int64 `json:"minutes"`

    Seconds     int64 `json:"seconds"`

    NanoSeconds int64 `json:"nanoSeconds"`

}


func main() {

    serverStartedTime = time.Now()


    http.HandleFunc("/api/v1/health", getHealthHandler)


    log.Fatal(http.ListenAndServe(":8000", nil))

}


func handler(writer http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(writer, "URL.Path = %q\n", request.URL.Path)

}



func getHealthHandler(writer http.ResponseWriter, request *http.Request) {

    serverUptime := time.Now().Sub(serverStartedTime)


    hours := int64(serverUptime.Hours())

    minutes := int64(serverUptime.Minutes()) - (hours * 60)

    seconds := int64(serverUptime.Seconds()) - (hours * 60) - (minutes * 60)

    nanoSeconds := int64(serverUptime.Nanoseconds()) - (hours * 60) - (minutes * 60) - (seconds * 1000000000)


    serverInformation := ServerInformation{

        ServerUptimeInformation{

            hours, minutes, seconds, nanoSeconds,

        },

    }


    returnJSON(writer, serverInformation)

}


func returnJSON(writer http.ResponseWriter, data ...interface{}) {

    dataJSON, marshalError := json.Marshal(data)


    if marshalError != nil {

        writer.WriteHeader(http.StatusInternalServerError)

    } else {

        writer.WriteHeader(http.StatusOK)

        writer.Header().Set("Content-Type", "application/json")

        writer.Write(dataJSON)

    }

}

默认情况下,Go 复制提供给方法的参数。因此,“/api/v1/health”的 HTTP 处理程序确实需要一个编写器,我们将其传递给该returnJSON方法。


因此,此方法确实收到了它写入的副本。


我怎么会在我的浏览器中看到响应?没想到作者被抄袭了。


萧十郎
浏览 90回答 1
1回答

慕的地10843

你认为ResponseWriter是一个结构体,但它是一个接口。每次您发送writer http.ResponseWriter到您的方法时,您都会发送指向实现该接口的结构的指针。执行此行以查看实际类型:fmt.Printf("%T\n", writer)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go