如何将结构作为参数传递给函数

问题描述 投票:1回答:1

我该怎么做?

我正在尝试将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。我知道这在语法上是错误的。

json go struct types slice
1个回答
3
投票

只需在函数外部声明您的类型:

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
© www.soinside.com 2019 - 2024. All rights reserved.