英文:
Casting firestore "integer_value" to integer
问题
使用Golang Firestore 1.8库,我正在尝试使用Google的Firestore在去年引入的新的count()函数。文档似乎还没有示例,至少我没有找到,但我已经拼凑出了一段基本可行的代码,几乎可以实现目标,只是没有生成一个整数。我对代码片段底部的"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是一个firestore.AggregationResult,似乎只包含一个map[string]interface{}
	result, err := ag.WithCount(userCountAlias).Get(s.Ctx)
	if err != nil {
		return -1, err
	}
	v := result[userCountAlias]//我如何将其转换为整数?
	fmt.Printf("Type = %v", v) //打印出"Type = integer_value:379"
	return -1, nil
}
英文:
Using the Golang Firestore 1.8 library, I'm trying to use the new-ish count() functions Google's Firestore introduced last fall. The docs don't seem to have examples yet, not that I've found, but I've cobbled together a somewhat-workable bit of code that gets me almost all the way, just short of actually producing an integer. The "result[userCountAlias]" value towards the bottom of this snippet is what I'm interested in converting to an integer, and I'm not quite sure how. I could, of course, take it as a string, split on the colon, and then parse it, but that seems ugly.
Any hints would be much appreciated!
Many thanks.
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
}
答案1
得分: 3
尝试使用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。
英文:
Try fmt.Printf("Type = %T", v) to find out the type of v.
v is most likely of type firestorepb.Value. Please note that this is not available in 1.8 yet. Try to upgrade cloud.google.com/go/firestore to its latest version (it's 1.9 as of now).
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
	}
}
The test in the official repository retrieves the value in the same way. See TestIntegration_CountAggregationQuery.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论