Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cli Go软件包读取外部文件_Go - Fatal编程技术网

使用cli Go软件包读取外部文件

使用cli Go软件包读取外部文件,go,Go,我正在使用cli Go软件包: 我是个新手。所以我可能做错了什么 我在命令行中执行此操作(我在目录中有一个名为markdown.txt的文件): ~/go/io$go运行io.go-文件markdown.txt 但我得到了这个错误: 由runtime.main/usr/lib/go/src/pkg/runtime/proc.c创建:221退出 状态2 编辑: 我将fmt.Println(“文件%s”,file)写入app.Action,但没有打印任何内容。这说明问题了吗?cli.Context.

我正在使用cli Go软件包:

我是个新手。所以我可能做错了什么

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

~/go/io$go运行io.go-文件markdown.txt

但我得到了这个错误:

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

编辑:


我将
fmt.Println(“文件%s”,file)
写入
app.Action
,但没有打印任何内容。这说明问题了吗?

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

您可以使用c.String(“文件”)或删除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

我为您添加了一个使用c.Args.Get(n)的示例
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