为了账号安全,请及时绑定邮箱和手机立即绑定

如何在隐藏某些字段的情况下详细打印结构?

如何在隐藏某些字段的情况下详细打印结构?

Go
弑天下 2022-07-18 17:04:19
我需要打印所有表单请求以进行日志记录,以供以后调试。我需要有这样的东西,formInput不同类型的结构在哪里。(全部在我的代码中定义。)type SomeFormInput {    Name string    Age int}func handleForm(formInput interface{}) {    ...    logger.Logf("%+v", formInput);}然而,一些表格包含需要在登录前清理的“秘密”数据——特别是密码。在不失一般性的情况下,最好和最简单的方法是什么handleForm?我仍然需要它来接受interface{}。如果需要,我可以使用标签。type SomeFormInput struct {    Name string    Password string `hide:"true"` // something like this}
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

对此没有完全通用的解决方案。只有特定的解决方案具有不同的权衡。


也许最通用的解决方案是编写一个函数,通过反射检查每种表单类型,并忽略输出中的任何敏感字段。


logger.Logf("%s", stripPassword(formInput));

这具有不再使用%+v动词的副作用,这通常无关紧要,但是如果您的类型实现了fmt.Formatter接口,它将改变行为。但话又说回来,你的目标是改变行为,所以...


这导致了第二种选择:


您可以Format()在您的类型上实现自定义方法,以导致%+v(或%v)%s输出您想要的任何内容(省略私有字段)。


沿着相同的思路,但更简单的是,如果您正在记录(或愿意记录)JSON 输出,只需json.Marshaler为每种类型隐含您自己的输出即可。例子:


func (i *SomeFormInput) MarshalJSON() ([]byte, error) {

    intermediate := struct{

        *SomeFormInput

        Password    struct{} `json:"-"` // Occlude Password field in the embedded struct

        MarshalJSON struct{} `json:"-"` // Occlude MarshalJSON method on embedded struct, to avoid infinite loop

    }{

        SomeFormInput: i,

    }

    return json.Marshal(intermediate)

}

类似的选项是将json:"-"标签用于不应输出的字段。例子:


type SomeFormInput struct {

    Name     string

    Password string `json:"-"`

}

作为最后一个选项,您可以在将日志输出发送到记录器之前对其进行过滤。如果您使用 JSON,则可以使用标记化 json.Decoder解析数据,以仅省略您想要的键。对于任意文本,也许可以使用正则表达式。


对于我工作的大多数应用程序,我实际上总是使用 JSON 日志记录,我可能更喜欢选项 #4,然后是 #5。


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信