Go应用程序文件/包结构

标签 go

我正在构建一个 CLI 应用程序,它可以导入一些数据(例如从数据库或 CSV、XML)并将其导出为其他格式(例如数据库或文件)。应用程序启动时指定导入器和导出器作为应用程序的输入参数。 我正在寻找有关如何构建文件/包的一些灵感。

目前,我已将每个进口商和导出商分开放在各自的文件中。每个导入器满足通用导入器接口(interface):

type Importer interface {
    Import() ([]*data, error)
    PreProcess() error
    PostProcess() error
}

因此,例如,CSVImporter 将实现这 3 个功能。导出商也是如此。目前所有的导入器和导出器都是主包的一部分,连同主文件。我认为这是最有意义的,因为它们是应用程序的一部分,不应在其他项目中使用。此外,由于我有很多配置设置(一些是通用的,一些是针对每个导入器和导出器的),它们在我的主包的开头是未编码的,我相信我的导入器和导出器应该是同一个包的一部分,以便我使用那里的设置。

package main

type ConfigFile struct {
    Environment    string
    Resources      *Resources
    Importers      *Importers
    Exporters      *Exporters
    ...
}

func main() {
    cfg ConfigFile


    // Load config file settings
    err := viper.Unmarshal(&cfg)

    var i StockImporter
    var e StockExporter

    // Create selected importer.
    switch viper.GetString("importer") {
         case "csv-importer":
         i = NewCSVImporter()
         ...
    }
}

我当前的文件结构如下所示:

app
|- main.go
|- importer.go
|- csvimporter.go
|- xmlimporter.go
|- exporter.go
|- csvexporter.go
| - lib
    | - db.go

我希望我目前的结构描述清楚。我的问题是:是否有更好的方法来构建我的应用程序?具体来说,我不喜欢将所有文件都放在与 main 相同的目录中。有什么建议么? 谢谢

最佳答案

看看How to Write Go Code

根据文档,这是工作空间在实践中的样子:

bin/
    hello                          # command executable
    outyet                         # command executable
pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a           # package object
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
    hello/
        hello.go               # command source
    outyet/
        main.go                # command source
        main_test.go           # test source
    stringutil/
        reverse.go             # package source
        reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
    bmp/
        reader.go              # package source
        writer.go              # package source
    ... (many more repositories and packages omitted) ...

我可能会创建一个 CSV 和一个 XML 包,并将它们相应的导入器/导出器放在那里,或者有一个导入器和一个导出器包。

更新:

建议的项目结构-

app
|- main.go
|- config
    |- config.go
|- importer
    |- importer.go
    |- csv.go
    |- xml.go
|- exporter
    |- exporter.go
    |- csv.go
    |- xml.go

关于Go应用程序文件/包结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45665698/

相关文章:

git - Go:如何向构建的二进制文件添加 git 修订版?

dictionary - go 的 map 哈希函数如何工作,具有 "same"值的不同类型会导致不同的键?

go - 为什么 time.Time 在 bson.Marshal 和 bson.Unmarshal 之后不相等?

去反射(reflection)元编程/模板

amazon-web-services - lambda 调用有效负载错误

sql - Go:用sql删除帖子

go - Go 如何将 3 字节序列转换为适当的 Unicode 字符?

go - 在端点上运行测试之前,无法在BeforeSuit中启动应用程序服务器

cookies - 如何删除cookie

go - 是否可以像这样通过反射获取函数名称?