最初我想我只会将指针用于可选的结构字段,在最初构建的情况下,这些字段可能为零。随着我的代码的发展,我在我的模型上编写了不同的层 - 用于 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 = 2
vs s.a = new(int); *s.a = 42
)和内存损失(abool
是一个字节,a*bool
是四到八),还有一件事是在全指针方法中真的困扰着我。它违反了单一职责原则。
是MyStruct
你从XML或DB一样得到MyStruct
?如果数据库架构会改变怎么办?如果 XML 更改格式怎么办?如果您还需要将其解组为 JSON,但方式略有不同,该怎么办?如果您需要同时支持所有这些(以及多个版本!)怎么办?
当你试图让一件事情做很多事情时,你会感到很多痛苦。拥有一种万能类型而不是 N 种专门类型真的值得吗?
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消