如何通过指针访问struct数组?

时间:2016-12-31 03:35:07

标签: go struct

以下是我的2个结构

type Attempt struct {
    StartTime        string `json:"startTime"`
    EndTime          string `json:"endTime"`
    LastUpdated      string `json:"lastUpdated"`
    Duration         uint32 `json:"duration"`
    SparkUser        string `json:"sparkUser"`
    IsCompleted      bool   `json:"completed"`
    LastUpdatedEpoch int64  `json:"lastUpdatedEpoch"`
    StartTimeEpoch   int64  `json:"startTimeEpoch"`
    EndTimeEpoch     int64  `json:"EndTimeEpoch"`
}

type Apps struct {
    Id       string    `json:"id"`
    Name     string    `json:"name"`
    Attempts []Attempt `json:"attempts"`
}

以下测试将json字符串解析为此apps := &[]Apps{}。访问apps的成员时,我收到以下错误

invalid operation: apps[0] (type *[]Apps does not support indexing)

测试

func TestUnmarshalApps(t *testing.T) {
    appsJson := `[
      {
        "id": "app-20161229224238-0001",
        "name": "Spark shell",
        "attempts": [
          {
        "startTime": "2016-12-30T03:42:26.828GMT",
        "endTime": "2016-12-30T03:50:05.696GMT",
        "lastUpdated": "2016-12-30T03:50:05.719GMT",
        "duration": 458868,
        "sparkUser": "esha",
        "completed": true,
        "endTimeEpoch": 1483069805696,
        "lastUpdatedEpoch": 1483069805719,
        "startTimeEpoch": 1483069346828
          },
          {
        "startTime": "2016-12-30T03:42:26.828GMT",
        "endTime": "2016-12-30T03:50:05.696GMT",
        "lastUpdated": "2016-12-30T03:50:05.719GMT",
        "duration": 458868,
        "sparkUser": "esha",
        "completed": true,
        "endTimeEpoch": 1483069805696,
        "lastUpdatedEpoch": 1483069805719,
        "startTimeEpoch": 1483069346828
          }
        ]
      },
      {
        "id": "app-20161229222707-0000",
        "name": "Spark shell",
        "attempts": [
          {
        "startTime": "2016-12-30T03:26:50.679GMT",
        "endTime": "2016-12-30T03:38:35.882GMT",
        "lastUpdated": "2016-12-30T03:38:36.013GMT",
        "duration": 705203,
        "sparkUser": "esha",
        "completed": true,
        "endTimeEpoch": 1483069115882,
        "lastUpdatedEpoch": 1483069116013,
        "startTimeEpoch": 1483068410679
          }
        ]
      }
    ]`
    apps := &[]Apps{}
    err := json.Unmarshal([]byte(appsJson), apps)
    if err != nil {
        t.Fatal(err)
    }
    if len(*apps) != 2 {
        t.Fail()
    }

    if len(apps[0].Attempts) != 2 {
        t.Fail()
    }
}

如何访问字段Attempts,Id等?

1 个答案:

答案 0 :(得分:3)

apps := &[]Apps{}

apps的类型为*[]Apps(指向Apps对象切片的指针)。

你确定你没有意思使用类型[]*Apps(指向Apps对象的指针片段)吗?

假设*[]Apps确实是您想要的类型,您需要使用(*apps)[i]来访问apps的每个元素。这种类型也是您还需要使用len(*apps)代替len(apps)(和*apps实际上几乎所有内容)的原因。