为什么 bson.M 的这种类型断言是必要的?

我有以下代码,使用 go.mongodb.org/mongo-driver 库:


updateMap := bson.M{

    "$set": bson.M{

        "dateAdded": primitive.NewDateTimeFromTime(time.Now()),

    },

}

if len(alias) > 0 {

    // I don't see how this type assertion is necessary

    updateMap["$set"].(map[string]interface{})["alias"] = alias

}

如果我做:


updateMap["$addFields"].(map[string]map[string]string)["alias"] = alias

它不编译。编译器已经知道 updateMap 是 bson.M 类型,它是一个map[string]interface{}. 如何断言它确实在map[string]interface{}做对编译器有用的事情?我以为它会想知道它实际上是什么类型的界面,但显然它不想让我那样做。


这里发生了什么?


编辑:当然,应该注意的是,这里没有类型断言,它不会编译:


无效操作:无法索引 updateMap["$addFields"](接口类型的地图索引表达式{})


Smart猫小萌
浏览 160回答 1
1回答

qq_笑_17

bson.M被定义为 的别名primitive.M,定义为type M map[string]interface{}(即非别名类型)。问题在于它updateMap["$set"]是一个bson.M,与 相比是一种不同的类型map[string]interface{}。因此,您的类型断言必须改为 to bson.M,例如:updateMap["$set"].(bson.M)["alias"] = aliasGo 游乐场中的可运行示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go