参数太灵活容易出错

参数太灵活容易出错

(金庆的专栏 2020.7)

golang中可以将参数类型设为 interface{}, 这样就可以传入任意类型的参数,
和 C++ 中 void* 的作用相似。
但是这种万能类型应该尽量少用,尽量使用具体的类型,或者使用一个具体的接口类型。
主要的原因是, 让编译期的类型检查挡住编码错误,减少运行期的错误。

例如,go-mongo-driver 有个创建索引的参数:

type IndexModel struct {
    // A document describing which keys should be used for the index. It cannot be nil.
    // This must be an order-preserving type such as bson.D. Map types such as bson.M are not valid.
    Keys interface{}
    ...
}

其中 Keys 可以是任意类型,如 1234, “abcd”, 当然不符合索引要求的类型会返回失败。
但是 bson.M 类型,会创建索引成功,但是索引的次序会有错误。
注释中已指出,不要用 bson.M, 应该使用 bson.D.

正确的 Keys 如下,表示复合索引 (field1, field2),1表示正序,-1则反序:

    indexModel.Keys := bson.D{{"field1", 1}, {"field2", 1}}

如果使用 bson.M, 实际上是个 map:

    indexModel.Keys := bson.M{"field1":1, "field2": 1}

因为 map 成员的次序不定,最后创建的索引可能是 (field1, field2),也可能是 (field2, field1)。

此处类型允许 interface{} 的想法是,允许任意类型,会 bson 编码后传给 mongo 服务器,并不会进行类型检查。
这种灵活性非常容易造成错误,并且如何使用也不明确, 仅靠注释作用很小。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值