【问题标题】:Documenting public methods on private structs via Godoc in Go在 Go 中通过 Godoc 记录私有结构上的公共方法
【发布时间】:2015-05-08 04:03:28
【问题描述】:

我有一个私有结构(实际上不止一个,我为这个例子做了一点简化),我有一个公共函数,它满足一个公共接口。 这个结构是通过工厂方法(NewX 风格)创建的:

package godocprivate

type PublicInterface interface {
    PublicFunction()
}

type privatestruct struct {
}

func NewPublic() *privatestruct {
    ps := &privatestruct{}
    return ps
}

// PublicFunction does something to be documented
func (self *privatestruct) PublicFunction() {
}

无法使工厂方法返回公共接口,因为在我的项目中还有其他接口需要返回值来满足。

我确实想通过 godoc 记录 PublicFunction(),但因为它位于私有结构上,所以它不会显示:

有什么方法、技巧、变通方法等让 privatestruct.PublicFunction() 在 Godoc 中可见?

我的实际用例更加严重:我确实有不止一个私有结构。它们都满足 PublicInterface,但它们各自的 PublicFunction 实现的内部工作方式不同,因此它们的文档是否也需要不同......

【问题讨论】:

    标签: go private godoc


    【解决方案1】:

    PublicFunction 使用PublicStruct,其私有字段将是私有的,带有私有文档。例如,

    package godocprivate
    
    type PublicInterface interface {
        PublicFunction()
    }
    
    type privatestruct struct {
    }
    
    // PublicStruct is something to be documented except for private fields
    type PublicStruct struct {
        privatestruct
    }
    
    func NewPublic() *PublicStruct {
        ps := &PublicStruct{}
        return ps
    }
    
    // PublicFunction does something to be documented
    func (p *PublicStruct) PublicFunction() {
    }
    

    创建PublicStruct 时,每个字段的初始值为零。如果这还不够,请引入工厂布尔值。例如,

    package godocprivate
    
    type PublicInterface interface {
        PublicFunction()
    }
    
    type privatestruct struct {
    }
    
    // PublicStruct is something to be documented except for private fields
    type PublicStruct struct {
        factory bool
        privatestruct
    }
    
    func NewPublic() *PublicStruct {
        ps := &PublicStruct{factory: true}
        return ps
    }
    
    // PublicFunction does something to be documented
    func (p *PublicStruct) PublicFunction() {
        if !p.factory {
            panic("Use NewPublic")
        }
    }
    

    【讨论】:

    • 很抱歉忽略了这个重要部分:我的私有结构有一个复杂的构造过程,所以我不希望包的任何消费者能够绕过工厂方法。您提出的解决方案将允许这样做。如果这样做是可行的,我可以首先将 privatestruct 公开。还是我在这里错过了一个很酷的技巧?
    • @PeterHommel:这些字段是私有的,因此 API 客户端无法设置它们。这意味着,如果 API 客户端尝试绕过您的构造函数,他们唯一能做的就是获得零值。谁在乎?但是,如果您不喜欢它,那么只需使用结构的所有公共方法定义一个公共接口,然后将其返回。
    • 但是,我会认真地简单地创建一个公共的、所有字段的私有结构——这似乎最像 go,并且是标准库中出现的一种模式。
    • @PeterHommel:查看我修改后的答案。
    • @peterSO:虽然我开始认为我可能有点过度封装了,但你的后一种解决方案真的很有创意!
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多