我有点想知道为什么下面的代码确实有效: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方法。因此,此方法确实收到了它写入的副本。我怎么会在我的浏览器中看到响应?没想到作者被抄袭了。
1 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
你认为ResponseWriter是一个结构体,但它是一个接口。
每次您发送writer http.ResponseWriter
到您的方法时,您都会发送指向实现该接口的结构的指针。
执行此行以查看实际类型:
fmt.Printf("%T\n", writer)
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报
0/150
提交
取消