2016-12-31 58 views
0

以下是我的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() 
    } 
} 

如何访问领域的尝试,身份证等?

回答

3
apps := &[]Apps{} 

apps有类型*[]Apps(指针切片应用对象)。

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

假设*[]Apps真的是你想要的类型,你需要使用(*apps)[i]访问的apps每一个元素。这种类型也是为什么您也需要使用len(*apps)而不是len(apps)(和*apps几乎适用于所有情况)的原因。

+0

我可以改为执行此操作:apps:= [] Apps {}; err:= json.Unmarshal([] byte(appsJson),&apps) –

+1

@ AravindR.Yarram当然,只要你的'Apps'类型没有任何期望指针接收器的方法,你就可以这样做(也就是说,你不需要有'func(a * Apps)方法(...)')。否则,您可能会想要使用'[] * Apps {}'。 –