我正在使用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
但没有打印出来。这会告诉我们这个问题吗?
答案 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