用 json.newencoder(w).encode(value) 可以把 go 结构体编码后写进 http 响应。先设置 content-type,再写响应体。只有可导出的结构体字段会按标签输出。

定义响应结构和处理函数
将完整示例保存为 main.go,只监听本地地址。
package main
import (
"encoding/json"
"log"
"net/http"
)
type status struct {
OK bool `json:"ok"`
Name string `json:"service"`
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(status{OK: true, Name: "demo"}); err != nil {
log.Printf("write response: %v", err)
}
})
log.Fatal(http.ListenAndServe("127.0.0.1:8080", mux))
}
标签决定 JSON 字段名。Encode 会在编码结果后加换行。
确认响应头和字段
启动服务后在另一个终端访问。
go run main.go # 另开终端 curl -i http://127.0.0.1:8080/status
应收到 200、application/json 和包含 ok、service 的对象。
需要先检查编码时怎么写
对可能无法编码的数据,可先用 Marshal 生成字节。以下替换处理函数中的写入逻辑。
body, err := json.Marshal(value)
if err != nil {
http.Error(w, "cannot encode response", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
if _, err := w.Write(body); err != nil {
log.Printf("write response: %v", err)
}value 是要返回的数据。响应已经开始写入后,应记录写入错误,不能再可靠地更改状态。


















