2016-12-31 2 views
0

Ниже приведены мои 2 СтруктурыКак получить доступ к массиву struct через указатель?

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

Как получить доступ к полям попыток, Id и т.д.?

ответ

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 {}'. –

Смежные вопросы