最初我认为我只使用可选结构字段的指针,在最初构建它的情况下可能会为零.
随着我的代码的发展,我在我的模型上编写了不同的层 - 用于xml和json(un)编组.在这些情况下,即使是我认为总是需求的字段(Id,Name等)实际上对某些图层来说也是可选的.
最后我在所有字段前放了一个*,所以int变为*int,字符串变为*string等.
现在我想知道我是不是更好地不那么概括我的代码?我本可以复制代码,我发现它相当丑陋 - 但也许比使用指针用于所有struct字段更有效?
所以我的问题是,这是否会变成一种反模式,只是一种糟糕的习惯,或者从性能的角度来看,这种增加的灵活性是否会带来成本?
例如.你能否提出坚持选项A的好理由:
type MyStruct struct {
Id int
Name string
ParentId *int
// etc.. only pointers where NULL columns in db might occur
}
Run Code Online (Sandbox Code Playgroud)
超过这个选项B:
type MyStruct struct {
Id *int
Name *string
ParentId *int
// etc... using *pointers for all fields
}
Run Code Online (Sandbox Code Playgroud)
构建结构的最佳实践方法是从纯数据库/列的角度来看,或者例如,如果您有:
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
}
Run Code Online (Sandbox Code Playgroud)
此示例可能是您要将XML中的元素添加到数据库的场景的一部分.这里的ID通常没有意义,所以我们在名称或其他别名上使用嵌套和引用.在INSERT查询后获取id之前,不会设置结构的Id.然后使用该ID我们可以遍历层次结构到子元素等.
这将允许我们只有1个MyStruct,并使用例如.不同的POST http请求处理函数,取决于调用是来自表单输入,还是xml导入,嵌套层次结构和不同关系可能需要进行不同的处理.
最后我想我的问题是:
你是否可以更好地分离db,xml和json操作的结构模型(或者你能想到的任何场景),而不是一直使用struct field指针,所以我们可以将模型重用于不同但相关的东西?
Ain*_*r-G 10
除了可能的性能(更多的指针=更多用于GC扫描的东西),安全性(零指针取消引用),便利性(s.a = 2vs s.a = new(int); *s.a = 42)和内存惩罚(a bool是一个字节,a *bool是4到8),有一件事是在全指针方法中真的困扰我.它违反了单一责任原则.
MyStruct你是从XML或DB得到的MyStruct吗?如果数据库架构会发生变化怎么办?如果XML改变格式怎么办?如果您还需要将其解组为JSON,但方式略有不同,该怎么办?如果你需要同时支持所有这些(以及多个版本!)该怎么办?
当你试图做一件事做很多事情时,你会遇到很多痛苦.有一个全能型而不是N型专用型非常值得吗?
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |