Как получить значения из интерфейса{}

# #go #couchbase #n1ql

Вопрос:

Я новичок в Go и хочу выяснить, как получать значения из интерфейса в Couchbase.

Мой текущий код:

 func Get_index() (bool, error) {  results, err := cluster.Query("SELECT COUNT(*) as result FROM `bucket`.`scope`.`collection`;", nil)  var greeting []interface{}  for results.Next() {  var h interface{}  err := results.Row(amp;h)  if err != nil {  return false, err  }  greeting = append(greeting, h)  fmt.Println("h =", h)  fmt.Printf("h type = %sn", reflect.TypeOf(h))  fmt.Println(greeting)  fmt.Printf("greeting = %sn", greeting)  }  return true, err }  

Результат:

 h = map[result:1] h type = map[string]interface {} [map[result:1]] greeting = [map[result:%!s(float64=1)]]  

Когда я пытаюсь получить значение по ключу «результат», то появляется ошибка, что я пытаюсь проиндексировать интерфейс по ключу, хотя, похоже, я имею в виду тип карты:

 invalid operation: h["result"] (type interface {} does not support indexing)  

Комментарии:

1. попробуйте var h map[string]interface{} вместо var h interface{} этого, а затем попробуйте h["result"]

2. Спасибо, @nipuna! Это работает

3. @PanagiotisKanavos: да, это правильный вопрос, но его задавали так много раз, что он показывает отсутствие каких-либо усилий здесь, поэтому я не удивлен, что он был отклонен. Кроме того, здесь нет «причуды», шаблоны для декодирования в значения четко определены, а поведение интерфейсов и утверждений типов (в частности, включая пустой интерфейс) даже описано во вступлении «Тур по Go». Дженерики также не заменят использование интерфейсов там, где интерфейсы все еще лучше подходят (что пользователи больше ценят в этом компромиссе, придется увидеть в ближайшие годы).

4. Да, Go использует пустой интерфейс для той же цели, но с сохранением типа и памяти. Я не уверен, что то, как object пишется interface{} , еще больше сбивает с толку, вы все равно должны изучить основы языка, и мы постараемся осветить это в начале вступительного материала.