我正在构建一个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
我希望我的当前结构能够清楚地描述出来。我的问题是:是否有更好的方法来构建我的应用程序?具体来说,我不喜欢将所有文件放在同一个目录中。有什么建议? 感谢
答案 0 :(得分:2)
从文档中,这是工作区在实践中的外观:
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