Struktura odpowiedzi o błędzie interfejsu Gmail API zawiera pole kodu zgodnie z Egzaminator

_, err := gmailService.Users.Messages.Send("me", &gMsg).Do()
t := reflect.TypeOf(err)
examiner(t,0)

Odpowiedź

Type is  and kind is ptr
 Contained type:
 Type is Error and kind is struct
     Field 1 name is Code type is int and kind is int
...

Mogę z powodzeniem uzyskać kod błędu za pomocą indeksu pola, ale jest to bardziej niejasne (i dlatego trudniejsze do utrzymania) i wydaje się bardziej kruche:

errReflectElem := reflect.ValueOf(err).Elem() 
fmt.Printf("err.Code %v\n",errReflectElem.Field(0).Interface())

Wygląda na to, że powinienem również uzyskać kod błędu w następujący sposób na podstawie tego przykładu:

fmt.Println("Code: %v",err.Code)

Jednak to daje błąd kompilacji:

err.Code undefined (type error has no field or method Code)

Czego mi brakuje?

go
-2
user1318390 7 grudzień 2018, 01:18

1 odpowiedź

Najlepsza odpowiedź

Zgodnie z dokumentacją zwraca *googleapi.Error. Po prostu potwierdź tego typu i masz pełny dostęp do wszystkiego, co zawiera. Jest to doskonały przykład potęgi interfejsów i właściwej obsługi błędów za pośrednictwem eksportowanego typu. Jeśli taki typ błędu jest eksportowany, nie ma potrzeby uzyskania do niego dostępu.

if gapiErr, ok := err.(*googleapi.Error); ok {
    // use gapiErr.WhateverField
}
0
RayfenWindspear 7 grudzień 2018, 01:47