Go,可扩展的文件分类系统

Go,可扩展的文件分类系统,go,dynamic,xml-parsing,Go,Dynamic,Xml Parsing,我的想法是创建一个脚本,它将遍历目录树,对文件进行分类,如果是照片,则执行操作,并上传到Flickr。如果是视频,请移动到文件夹 我没有围棋的知识,但我想改变这一点。文件发现和分类似乎不是主要部分。例程和通道似乎足够有一个非阻塞系统 我主要关心的是要采取的行动。我肯定会为mv、cp等编写一些操作,如FlickrUpload或Shell。。。但我希望有一个可配置的系统,可以将动作附加到mime类型。我认为Xml结构可以很好地配置它,而且似乎很容易解析 <?xml version="1.0"

我的想法是创建一个脚本,它将遍历目录树,对文件进行分类,如果是照片,则执行操作,并上传到Flickr。如果是视频,请移动到文件夹

我没有围棋的知识,但我想改变这一点。文件发现和分类似乎不是主要部分。例程和通道似乎足够有一个非阻塞系统

我主要关心的是要采取的行动。我肯定会为mv、cp等编写一些操作,如FlickrUpload或Shell。。。但我希望有一个可配置的系统,可以将动作附加到mime类型。我认为Xml结构可以很好地配置它,而且似乎很容易解析

<?xml version="1.0" standalone="yes">
<configuration>
  <file type="image/jpg">
    <action name="FlickrUpload" />
    <action name="Shell">
      mv ${file} /some/absolute/path/
    </action>
    <!-- or -->
    <FlickrUpload /> 
  </file>
</configuration>

从XML流或任何其他文本媒体,只能获取文本。 因此,mv${file}/some/absolute/path/本质上是文本

这意味着您将不可避免地需要在实际调用之前解析它 你对你分析出来的任何东西的实际行动

现在,这个问题有两个方面:

一旦知道某个动作,如何调用特定的Go代码。 如何将操作参数数据传递给它。 它们有点相互交织,这取决于你决定如何解1

给定Go函数的文本句柄,调用Go函数的第一种方法是 只需将这些句柄映射到函数,如下所示:

type Action func (...interface{}) error

var actions = map[string]Action {
    "mv": Move,
    "flickr": UploadToFlickr,
}

func Move(args ...interface{}) error {
    // implement
}

func UploadToFlickr(args ...interface{}) error {
    // implement
}
func ConfigParser() (map[string]Action, error)
现在你可以像

act, ok := actions[action_name]
if !ok {
  log.Fatalf("Config error: Unsupported action: %s\n', action_name)
}

err := act(action_args...)
if err != nil {
   // Handle
}
注意这些。。。位:它们实现可变函数 并允许将一段值传递给一个变量函数

第二种方法是使用更严格的类型:

您可以定义一个接口:

type Action interface {
    func Do(fname string) error
}
配置解析代码将生成具体类型的值 比如说,MoveAction,FlickrUploadAction

所有这些类型都必须实现接口操作的Do方法

通过这样做,他们自动实现了上述接口。 这也意味着您的条件配置解析器可以返回该参数的值 接口如下所示:

type Action func (...interface{}) error

var actions = map[string]Action {
    "mv": Move,
    "flickr": UploadToFlickr,
}

func Move(args ...interface{}) error {
    // implement
}

func UploadToFlickr(args ...interface{}) error {
    // implement
}
func ConfigParser() (map[string]Action, error)
…其中map[string]操作将映射文件的MIME类型 到具体类型的值,例如FlickrUploadAction 对于类型为image/png的文件和类型为 文本/纯文本

要调用某个动作,请查找该动作生成的映射 ConfigParser函数使用文件的MIME类型并获取一个值 它实现了操作接口,所以剩下的只是 调用其Do方法并将实际文件的名称传递给它

TL;博士 阅读一下界面,它们是超级强大且无处不在的
在标准库中,看看那些io.Readers和io.writer。

这个问题肯定有点宽泛,但您可以通过添加一些代码来说明您打算如何实际解析上述XML之类的内容,使其更适合这样做。即使这些代码还不能很好地工作,这也应该有助于缩小你问题的焦点,让别人能够更具体地回答你的问题。你不是在重新实现吗?结合输入和使用任何过滤器和/或输出插件进行操作。@Pablollalloni我确信这种工具已经存在。但我的只是一个学习围棋的具体案例。无论如何,谢谢你指点FlexGet。