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

我需要打印所有表单请求以进行日志记录,以供以后调试。我需要有这样的东西,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

}


弑天下
浏览 89回答 1
1回答

收到一只叮咚

对此没有完全通用的解决方案。只有特定的解决方案具有不同的权衡。也许最通用的解决方案是编写一个函数,通过反射检查每种表单类型,并忽略输出中的任何敏感字段。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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go