使用cli Go包读取外部文件

时间:2015-02-17 15:48:43

标签: go

我正在使用cli Go包:https://github.com/codegangsta/cli

package main

import (
    "fmt"
    "github.com/codegangsta/cli"
    "io/ioutil"
    "os"
)

func main() {
    app := cli.NewApp()
    app.Name = "m2k"
    app.Usage = "convert markdown to kindle"
    app.Flags = []cli.Flag{
        cli.StringFlag{
            Name:  "file",
            Value: "english",
            Usage: "language for the greeting",
        },
    }

    app.Action = func(c *cli.Context) {
        file := "default"

        if len(c.Args()) > 0 {
            file = c.Args()[0]
        }

        //fmt.Println("file %s", file)
        fmt.Println("file %s", file)

        b, err := ioutil.ReadFile(file)
        if err != nil {
            panic(err)
        }

        err = ioutil.WriteFile("output.txt", b, 0644)
        if err != nil {
            panic(err)
        }
    }

    app.Run(os.Args)
}

我是初学者。所以我可能做错了。

我在命令行中执行此操作(目录中有一个名为markdown.txt的文件):

  

〜/ go / io $ go run io.go -file markdown.txt

但是我收到了这个错误:

  

由runtime.main /usr/lib/go/src/pkg/runtime/proc.c:221退出   状态2

修改

我向fmt.Println("file %s", file)写了app.Action但没有打印出来。这会告诉我们这个问题吗?

1 个答案:

答案 0 :(得分:2)

cli.Context.Args从当前上下文返回args。意思,而不是提供的全局参数。如果你打印c.Args的长度,你会看到它是零。

您可以使用c.String(“file”)或删除app.Flags,以go run io.go path / to / file.txt的格式提供命令并使用c.Args.First()

示例:

package main

import (
    "github.com/codegangsta/cli"

    "io/ioutil"
    "log"
    "os"
    "strings"
)

func main() {
    app := cli.NewApp()
    app.Name = "m2k"
    app.Usage = "convert markdown to kindle"
    app.Action = mainAction
    app.Run(os.Args)
}

func mainAction(c *cli.Context) {
    var err error

    // use stdin/stdout by default
    in := os.Stdin
    out := os.Stdout
    defer out.Close()
    defer in.Close()

    // replace stdin if given
    if c.Args().First() != "" {
        in, err = os.Open(c.Args().First())
        if err != nil {
            log.Fatalln(err)
        }
        log.Printf("Using '%s' as source\n", c.Args().First())
    }

    // replace stdout if given
    if c.Args().Get(1) != "" {
        out = os.NewFile(0666, c.Args().Get(1))
        log.Printf("Writing output to '%s'\n", c.Args().Get(1))
    }

    b, err := ioutil.ReadAll(in)
    if err != nil {
        log.Fatalln(err)
    }

    out.Write([]byte(strings.Replace(string(b), "in", "out", 1)))
}

结果:

echo "in file content" > in.txt
go run foo.go in.txt
// 2015/02/17 11:49:49 Using 'in.txt' as source
// out file content