转到app文件/包结构

时间:2017-08-13 23:20:41

标签: go

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

目前,我已将每个导入程序和导出程序分隔在自己的文件中。每个导入程序都满足一般导入程序接口:

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

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

1 个答案:

答案 0 :(得分:2)

查看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