最初我想我只会将指针用于可选的结构字段,在最初构建的情况下,这些字段可能为零。
随着我的代码的发展,我在我的模型上编写了不同的层 - 用于 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 操作(或您能想到的任何场景)的结构模型分开,而不是一直使用结构字段指针,以便我们可以将模型重用于不同但相关的东西?
江户川乱折腾
相关分类