使用cli Go软件包读取外部文件
我正在使用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.
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