任何下端总是使用struct字段类型的指针?

Dac*_*d3r 5 go

最初我认为我只使用可选结构字段的指针,在最初构建它的情况下可能会为零.

随着我的代码的发展,我在我的模型上编写了不同的层 - 用于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型专用型非常值得吗?