2016-11-18 6 views
2

Прежде всего, я немного выше новичка в Go и нуждаюсь в небольшой помощи. Я думал, что я утверждал (насколько я узнал Go), но я получаю эту ошибку cannot use readBack["SomePIN"] (type interface {}) as type string in argument to c.String: need type assertionОШИБКА: требуется тип утверждения

Вот мой код (этот фрагмент от функции Request Handler, и я использую веб-рамку Echo и Tiedot NoSQL базы данных)

// To get query result document, simply 
// read it [as stated in the Tiedot readme.md] 
for id := range queryResult { 
    readBack, err := aCollection.Read(id) 
    if err != nil { 
     panic(err) 
    } 
    if readBack["OtherID"] == otherID { 
     if _, ok := readBack["SomePIN"].(string); ok { 
      return c.String(http.StatusOK, readBack["SomePIN"]) 
     } 
    } 
} 

ответ

6

Вы утверждаете readBack["SomePIN"] в виде строки - в заявке if. Это не делает никаких изменений в readBack["SomePIN"], однако - это все еще интерфейс {}. В Go ничего не меняется. Вот что будет работать:

for id := range queryResult { 
    readBack, err := aCollection.Read(id) 
    if err != nil { 
     panic(err) 
    } 
    if readBack["OtherID"] == otherID { 
     if somePIN, ok := readBack["SomePIN"].(string); ok { 
      return c.String(http.StatusOK, somePIN) 
     } 
    } 
} 

Вы метались значение строки из вашего типа утверждения, но вы хотите. Так что держите его, как somePIN, а затем используйте его.

Заключительное примечание - использование синтаксиса value, ok = interfaceVal.(type) - хорошая практика. Если interfaceVal окажется нестрочным, вы получите value = "" и ok = false. Если вы исключите значение ok из утверждения типа, а interfaceVal - это не строка, программа будет паниковать.

3

похоже, ваши преобразования к конкретному типу и выбрасывая преобразования, я думаю, что это должно работать:

if somePinString, ok := readBack["SomePIN"].(string); ok { 
     return c.String(http.StatusOK, somePinString) 
    } 
Смежные вопросы