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

总是使用结构字段类型的指针的任何缺点?

总是使用结构字段类型的指针的任何缺点?

Go
红糖糍粑 2021-10-18 16:32:52
最初我想我只会将指针用于可选的结构字段,在最初构建的情况下,这些字段可能为零。随着我的代码的发展,我在我的模型上编写了不同的层 - 用于 xml 和 json (un) marshalling。在这些情况下,即使是我认为永远是必需的字段(Id、Name 等),实际上对于某些层来说也是可选的。最后,我在所有字段前面放了一个 *,包括 int 变成 *int,string 变成 *string 等。现在我想知道如果我没有对我的代码进行太多概括是否更好?我本可以复制代码,但我觉得这很丑陋 - 但也许比对所有结构字段使用指针更有效?所以我的问题是这是否正在变成一种反模式并且只是一个坏习惯,或者从性能的角度来看,这种增加的灵活性是否不会以牺牲为代价?例如。你能提出坚持选项 A 的好论据吗:type MyStruct struct {    Id int    Name string    ParentId *int    // etc.. only pointers where NULL columns in db might occur}在此选项 B 上:type MyStruct struct {    Id *int    Name *string    ParentId *int    // etc... using *pointers for all fields}将结构建模的最佳实践方法是从纯粹的数据库/列角度来看,还是例如,如果您有:func (m *MyStruct) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {    var v struct {        XMLName     xml.Name     `xml:"myStruct"`        Name        string       `xml:"name"`        Parent      string       `xml:"parent"`        Children    []*MyStruct  `xml:"children,omitempty"`    }    err := d.DecodeElement(&v, &start)    if err != nil {        return err    }    m.Id = nil // adding to db from xml, there's initially no Id, until after the insert    m.Name = v.Name // a parent might be referenced by name or alias    m.ParentId = nil // not by parentId, since it's not created yet, but maybe by nesting elements like you see above in the V struct (Children []*ContentType)    // etc..    return nil}此示例可能是您希望将 XML 中的元素添加到数据库的场景的一部分。这里的 id 通常没有意义,所以我们在名称或其他别名上使用嵌套和引用。在 INSERT 查询之后,在我们获得 id 之前,不会设置结构的 Id。然后使用该 ID,我们可以将层次结构向下遍历到子元素等。这将允许我们只有 1 个 MyStruct,并使用例如。不同的 POST http 请求处理函数,取决于调用是来自表单输入,还是 xml 导入,其中嵌套层次结构和不同的关系可能需要不同的处理。最后我想我要问的是:您是否最好将 db、xml- 和 json 操作(或您能想到的任何场景)的结构模型分开,而不是一直使用结构字段指针,以便我们可以将模型重用于不同但相关的东西?
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

除了可能的性能(更多的指针 = GC 要扫描的更多东西)、安全性(零指针取消引用)、便利性(s.a = 2vs s.a = new(int); *s.a = 42)和内存损失(abool是一个字节,a*bool是四到八),还有一件事是在全指针方法中真的困扰着我。它违反了单一职责原则

MyStruct你从XML或DB一样得到MyStruct?如果数据库架构会改变怎么办?如果 XML 更改格式怎么办?如果您还需要将其解组为 JSON,但方式略有不同,该怎么办?如果您需要同时支持所有这些(以及多个版本!)怎么办?

当你试图让一件事情做很多事情时,你会感到很多痛苦。拥有一种万能类型而不是 N 种专门类型真的值得吗?


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

添加回答

举报

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