我该怎么做?
我正在尝试将struct
作为参数传递给Go语言。
func handleEntityProperties(w http.ResponseWriter, r *http.Request) {
const sliceSize = 100
var entityProperties struct {
Instance string `json:"instance"`
Entities []struct {
Id string `json:"id"`
Properties map[string]string `json:"properties"`
Type string `json:"type"`
} `json:"entities"`
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
if !json.Valid([]byte(body)) {
fmt.Fprintf(w, "invalid json")
return
}
err = json.Unmarshal(body, &entityProperties)
sendData(entityProperties.Entities[0:100])
return
}
func sendData(entities struct) {
log.Println("Doing things with entities ", entities)
}
您可以在代码中看到,我正在尝试将entityProperties.Entities
struct
的前100个元素发送到sendData
。我知道这在语法上是错误的。
只需在函数外部声明您的类型:
type entity struct {
Id string `json:"id"`
Properties map[string]string `json:"properties"`
Type string `json:"type"`
}
并在handleEntityProperties()
和sendData()
的签名中重用它:
func handleEntityProperties(w http.ResponseWriter, r *http.Request) {
const sliceSize = 100
var entityProperties struct {
Instance string `json:"instance"`
Entities []entity `json:"entities"`
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
if !json.Valid([]byte(body)) {
fmt.Fprintf(w, "invalid json")
return
}
err = json.Unmarshal(body, &entityProperties)
sendData(entityProperties.Entities[0:sliceSize])
return
}
func sendData(entities []entity) {
log.Println("Doing things with entities ", entities)
}
还请注意,不能保证客户端将至少发送100个实体,因此您应检查切片表达式是否会导致运行时出现紧急情况:
max := 100
if len(entityProperties.Entities) < max {
max = len(entityProperties.Entities)
}
sendData(entityProperties.Entities[:max])
也不需要检查无效的JSON:如果JSON无效,json.Unmarshal()
将报告一个(非json.Unmarshal()
)错误,您会知道的。
进一步,您甚至不必将整个主体读入内存(读入字节片),您可以使用nil
像这样直接从中读取(无中间存储缓冲区):
json.Decoder
所以改进的版本可能看起来像这样:
json.Decoder