为什么不能将这些数据正确地解组到我的对象模型中?

I have a (non)working example here: https://play.golang.org/p/qaYhKvJ65J3

I'm not sure why the following data:

alertData := `{
    "Id": 0,
    "Version": 0,
    "OrgId": 1,
    "DashboardId": 61,
    "PanelId": 84,
    "Name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
    "Message": "",
    "Severity": "",
    "State": "",
    "Handler": 1,
    "Silenced": false,
    "ExecutionError": "",
    "Frequency": 10,
    "EvalData": null,
    "NewStateDate": "0001-01-01T00:00:00Z",
    "PrevStateDate": "0001-01-01T00:00:00Z",
    "StateChanges": 0,
    "Created": "0001-01-01T00:00:00Z",
    "Updated": "0001-01-01T00:00:00Z",
    "Settings": {
        "conditions": [
            {
                "evaluator": {
                    "params": [
                        10000
                    ],
                    "type": "gt"
                },
                "operator": {
                    "type": "and"
                },
                "query": {
                    "datasourceId": 2,
                    "model": {
                        "hide": true,
                        "refCount": 0,
                        "refId": "C",
                        "textEditor": false
                    },
                    "params": [
                        "C",
                        "5m",
                        "now"
                    ]
                },
                "reducer": {
                    "params": [],
                    "type": "avg"
                },
                "type": "query"
            }
        ],
        "executionErrorState": "keep_state",
        "frequency": "10s",
        "handler": 1,
        "name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
        "noDataState": "keep_state",
        "notifications": []
    }
}`

Can't be unmarshalled into the following object model:

type Condition struct {
    Evaluator struct {
        Params []int  `json:"params"`
        Type   string `json:"type"`
    } `json:"evaluator"`
    Operator struct {
        Type string `json:"type"`
    } `json:"operator"`
    Query struct {
        Params []string `json:"params"`
    } `json:"query"`
    Reducer struct {
        Params []interface{} `json:"params"`
        Type   string        `json:"type"`
    } `json:"reducer"`
    Type string `json:"type"`
}

When I do the following:

condition := Condition{}
err := json.Unmarshal([]byte(alertData), &condition)

if err != nil {
    panic(err)
}

fmt.Printf("

 json object:::: %+v", condition)

I just get: json object:::: {Evaluator:{Params:[] Type:} Operator:{Type:} Query:{Params:[]} Reducer:{Params:[] Type:} Type:}

Ideally I'd be able to parse it into something like type Conditions []struct{ } but I'm not sure if you can define models as lists?

It looks like you are trying to access the "conditions" property nested under the root "Settings" property. As such, you need to define that root-level type and enough fields to tell the unmarshaler how to find your target property. As such, you would just need to create a new "AlertData" type with the necessary "Settings/conditions" fields.

For example (Go Playground):

type AlertData struct {
  Settings struct {
    Conditions []Condition `json:"conditions"`
  }
}

func main() {
  alert := AlertData{}
  err := json.Unmarshal([]byte(alertData), &alert)

  if err != nil {
    panic(err)
  }

  fmt.Printf("OK: conditions=%#v
", alert.Settings.Conditions)
  // OK: conditions=[]main.Condition{main.Condition{Evaluator:struct { Params []int "json:\"params\""; Type string "json:\"type\"" }{Params:[]int{10000}, Type:"gt"}, Operator:struct { Type string "json:\"type\"" }{Type:"and"}, Query:struct { Params []string "json:\"params\"" }{Params:[]string{"C", "5m", "now"}}, Reducer:struct { Params []interface {} "json:\"params\""; Type string "json:\"type\"" }{Params:[]interface {}{}, Type:"avg"}, Type:"query"}}
}

Note that the printed listing includes so much type information because the "Condition" type uses anonymous structs as field types. If you were to extract them into named structs it will be easier to work with the data, e.g.:

type Condition struct {
  Evaluator Evaluator `json:"evaluator"`
  Operator  Operator  `json:"operator"`
  // ...
}

type Evaluator struct {
  Params []int  `json:"params"`
  Type   string `json:"type"`
}

type Operator struct {
  Type string `json:"type"`
}

//...
// OK: conditions=[]main.Condition{
//   main.Condition{
//     Evaluator:main.Evaluator{Params:[]int{10000}, Type:"gt"},
//     Operator:main.Operator{Type:"and"},
//     Query:main.Query{Params:[]string{"C", "5m", "now"}},
//     Reducer:main.Reducer{Params:[]interface {}{}, Type:"avg"},
//     Type:"query",
//   },
// }

Go Playground example here...

Maerics explanation is correct, here is an alternative approach which wraps access around struct methods, the data structure is also fully defined. If you're new to Go it's good to get handle on creating the data structures yourself, but here is a handy utility for helping create structs from valid JSON https://mholt.github.io/json-to-go/

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "time"
)

type Data struct {
    ID             int         `json:"Id"`
    Version        int         `json:"Version"`
    OrgID          int         `json:"OrgId"`
    DashboardID    int         `json:"DashboardId"`
    PanelID        int         `json:"PanelId"`
    Name           string      `json:"Name"`
    Message        string      `json:"Message"`
    Severity       string      `json:"Severity"`
    State          string      `json:"State"`
    Handler        int         `json:"Handler"`
    Silenced       bool        `json:"Silenced"`
    ExecutionError string      `json:"ExecutionError"`
    Frequency      int         `json:"Frequency"`
    EvalData       interface{} `json:"EvalData"`
    NewStateDate   time.Time   `json:"NewStateDate"`
    PrevStateDate  time.Time   `json:"PrevStateDate"`
    StateChanges   int         `json:"StateChanges"`
    Created        time.Time   `json:"Created"`
    Updated        time.Time   `json:"Updated"`
    Settings       struct {
        Conditions          []Condition   `json:"conditions"`
        ExecutionErrorState string        `json:"executionErrorState"`
        Frequency           string        `json:"frequency"`
        Handler             int           `json:"handler"`
        Name                string        `json:"name"`
        NoDataState         string        `json:"noDataState"`
        Notifications       []interface{} `json:"notifications"`
    } `json:"Settings"`
}

type Condition struct {
    Evaluator struct {
        Params []int  `json:"params"`
        Type   string `json:"type"`
    } `json:"evaluator"`
    Operator struct {
        Type string `json:"type"`
    } `json:"operator"`
    Query struct {
        DatasourceID int `json:"datasourceId"`
        Model        struct {
            Hide       bool   `json:"hide"`
            RefCount   int    `json:"refCount"`
            RefID      string `json:"refId"`
            TextEditor bool   `json:"textEditor"`
        } `json:"model"`
        Params []string `json:"params"`
    } `json:"query"`
    Reducer struct {
        Params []interface{} `json:"params"`
        Type   string        `json:"type"`
    } `json:"reducer"`
    Type string `json:"type"`
}

func (d Data) GetFirstCondition() (Condition, error) {
    if len(d.Settings.Conditions) > 0 {
        return d.Settings.Conditions[0], nil
    }
    return Condition{}, fmt.Errorf("no conditions found")
}

func (d Data) GetConditionByIndex(index uint) (Condition, error) {
    if len(d.Settings.Conditions) == 0 {
        return Condition{}, fmt.Errorf("no conditions found")
    }

    if int(index) > len(d.Settings.Conditions)-1 {
        return Condition{}, fmt.Errorf("index out of bounds")
    }

    return d.Settings.Conditions[index], nil
}

var alertData = `{
    "Id": 0,
    "Version": 0,
    "OrgId": 1,
    "DashboardId": 61,
    "PanelId": 84,
    "Name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
    "Message": "",
    "Severity": "",
    "State": "",
    "Handler": 1,
    "Silenced": false,
    "ExecutionError": "",
    "Frequency": 10,
    "EvalData": null,
    "NewStateDate": "0001-01-01T00:00:00Z",
    "PrevStateDate": "0001-01-01T00:00:00Z",
    "StateChanges": 0,
    "Created": "0001-01-01T00:00:00Z",
    "Updated": "0001-01-01T00:00:00Z",
    "Settings": {
        "conditions": [
            {
                "evaluator": {
                    "params": [
                        10000
                    ],
                    "type": "gt"
                },
                "operator": {
                    "type": "and"
                },
                "query": {
                    "datasourceId": 2,
                    "model": {
                        "hide": true,
                        "refCount": 0,
                        "refId": "C",
                        "textEditor": false
                    },
                    "params": [
                        "C",
                        "5m",
                        "now"
                    ]
                },
                "reducer": {
                    "params": [],
                    "type": "avg"
                },
                "type": "query"
            }
        ],
        "executionErrorState": "keep_state",
        "frequency": "10s",
        "handler": 1,
        "name": "{qa-dev}{stats-pipeline} Topology Message Age (aggregator) alert",
        "noDataState": "keep_state",
        "notifications": []
    }
}`

func main() {
    var res Data
    err := json.Unmarshal([]byte(alertData), &res)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res.GetFirstCondition())
    fmt.Println(res.GetConditionByIndex(0))
    // should fail :-)
    fmt.Println(res.GetConditionByIndex(1))

}