Приведение firestore "integer_value" к целому числу

Используя библиотеку Golang Firestore 1.8, я пытаюсь использовать новые функции count(), представленные Google Firestore прошлой осенью. В документах, похоже, еще нет примеров, не то, что я нашел, но я собрал несколько работоспособный фрагмент кода, который помогает мне почти полностью, за исключением фактического создания целого числа. Значение «result[userCountAlias]» в нижней части этого фрагмента — это то, что мне нужно преобразовать в целое число, и я не совсем уверен, как это сделать. Я мог бы, конечно, взять его как строку, разделить на двоеточие, а затем разобрать, но это выглядит некрасиво.

Любые подсказки будут высоко оценены!

Большое спасибо.

func (s UserService) Count(labID string) (int64, error) {

    if s.DB == nil {
        return -1, customerrors.ErrDatabaseMissing
    }

    query := s.DB.
        Collection(CollectionUsers).
        Where("lab_id", "= = ", labID)


    userCountAlias := "userCount"

    ag := query.NewAggregationQuery()

    //result is a firestore.AggregationResult, which seems to consist of just a 
    //map[string]interface{}
    result, err := ag.WithCount(userCountAlias).Get(s.Ctx)

    if err != nil {
        return -1, err
    }

    v := result[userCountAlias]//How do I cast this to an integer?
    fmt.Printf("Type = %v", v) //Prints "Type = integer_value:379"

    return -1, nil
}
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте fmt.Printf("Type = %T", v) узнать тип v.

v, скорее всего, имеет тип firestorepb.Value. Обратите внимание, что это пока недоступно в версии 1.8. Попробуйте обновить cloud.google.com/go/firestore до последней версии (на данный момент это 1.9).

package main

import (
    "fmt"

    "cloud.google.com/go/firestore/apiv1/firestorepb"
)

func main() {
    var v interface{} = &firestorepb.Value{
        ValueType: &firestorepb.Value_IntegerValue{
            IntegerValue: 379,
        },
    }

    fmt.Printf("%T\n", v) // *firestorepb.Value
    fmt.Printf("%v\n", v) // integer_value:379

    if v, ok := v.(*firestorepb.Value); ok {
        fmt.Printf("%v\n", v.GetIntegerValue()) // 379
    }
}

Тест в официальном репозитории извлекает значение таким же образом. См. TestIntegration_CountAggregationQuery.

Спасибо! Приведение v к *firestorepb.Value вместе с вызовом v.GetIntegerValue() абсолютно помогло.

Brent 11.04.2023 15:13

Другие вопросы по теме