登录
首页 >  Golang >  Go问答

使用计算属性的方法

来源:stackoverflow

时间:2024-03-01 21:12:25 417浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《使用计算属性的方法》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我将附件作为附件对象存储在 mongodb 中:

type attachment struct {
  id   string `bson:"_id" json:"id"`
  name string `bson:"name" json:"name"`
  url  string `bson:"url" json:"url"`
}

存储的 url 是 put 请求的预签名 url,使用 aws 会话检索。 在 ruby on rails 中,我可以使用虚拟属性将 url 更改为 get 请求的预签名 url:

// models/attachment.rb
def url
  if super.present?
    // get the presigned URL for get request using the URL from super
  else
    super
  end
end

如何在 go 中实现这一点?我的配置位于 config.yaml 中,需要将 yaml 转换为结构。同时,bson 的 marshal 和 unmarshal 只接收 data []byte 作为参数。我不确定如何在 bson 的编组和解组中启动 aws 会话。

我更喜欢在从 mongodb 查询后修改 url,但我想在 1 个地方进行


解决方案


mongo-gomgo 驱动程序在 go 值与 bson 值之间进行转换时检查并调用某些已实现的接口。在您的类型上实现 bson.Marshalerbson.Unmarshaler,您可以在保存之前/加载之后执行任何操作。

调用默认的 bson.Marhsal()bson.Unmarshal() 函数来执行常规的编组/解组过程,如果成功,则在返回之前执行您想要的操作。

例如:

// Called when an Attachment is saved.
func (a *Attachment) MarshalBSON() (data []byte, err error) {
    data, err = bson.Marshal(a)
    if err != nil {
        return
    }

    // Do your additional thing here

    return
}

// Called when an Attachment is loaded.
func (a *Attachment) UnmarshalBSON(data []byte) error {
    if err := bson.Unmarshal(data, &a); err != nil {
        return err
    }

    // Do your additional thing here

    return nil
}

另请参阅相关:How to ignore nulls while unmarshalling a MongoDB document?

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>