我正在构建一个 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 相同的目录中。有什么建议么? 谢谢
最佳答案
根据文档,这是工作空间在实践中的样子:
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/