如何通过指针访问结构体数组?

huangapple go评论92阅读模式
英文:

How to access a struct array through a pointer?

问题

以下是我的两个结构体:

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等字段?

英文:

Following are my 2 structs

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"`
}

The following test parses a json string into this apps := &[]Apps{}. When accessing the members of apps, I am getting the following error

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

The test

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()
	}
}

How to access the fields Attempts, Id etc.?

答案1

得分: 3

apps := &[]Apps{}

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

你确定你不是想使用类型 []*Apps(指向 Apps 对象指针的切片)吗?

假设 *[]Apps 确实是你想要的类型,你需要使用 (*apps)[i] 来访问 apps 的每个元素。这个类型也是为什么你需要使用 len(*apps) 而不是 len(apps)(实际上几乎所有的地方都需要使用 *apps)。

英文:
apps := &[]Apps{}

apps has type *[]Apps (pointer to slice of Apps objects).

Are you sure you didn't mean to use the type []*Apps (slice of pointers to Apps objects)?

Assuming *[]Apps really is the type you intended, you'd need to use (*apps)[i] to access every element of apps. That type is also the reason why you also need to use len(*apps) instead of len(apps) (and *apps for pretty much everything actually).

huangapple
  • 本文由 发表于 2016年12月31日 11:35:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/41405202.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定