我正在Go中迈出第一步。我有一个cli命令,暂时只需删除并使用go和Postgres dropdb + createdb工具重新创建数据库。
以下代码会产生不一致的结果。结帐功能打印或不打印“out”字节变量。
我怀疑某些竞争条件,我应该在某处使用指针,而不是将值传递给同一个函数。
这段代码不好吗?
func ensurepath(command string) string {
ensuredcommand, LookErr := exec.LookPath(command)
if LookErr != nil {
log.Fatalf("%v is not found", command)
}
log.Printf("ensure path for command '%v' : %v", command, ensuredcommand)
return command
}
// warning : cmd error message is also a "out" value, it is not in err
func checkout(err error, out []byte) {
if err != nil {
log.Printf("command error %v : %s", err, out)
} else {
log.Printf("command result %T : %s", out, out)
}
}
var restore = cli.Command{
Name: "restore",
Aliases: []string{"r"},
Usage: "restore backup",
Action: func(c *cli.Context) error {
cmdArgs := "devdb"
dropDB := ensurepath("dropdb")
createDB := ensurepath("createdb")
outErrDrop, err := exec.Command(dropDB, cmdArgs).CombinedOutput()
checkout(err, outErrDrop)
outErrCreate, createErr := exec.Command(createDB, cmdArgs).CombinedOutput()
checkout(createErr, outErrCreate)
return nil
},
}
修改
奇怪的输出示例
如果我对“createDB”部分对应的行进行注释,这意味着我只删除了数据库,我有一个一致的预期输出。
var restore = cli.Command{
Name: "restore",
Aliases: []string{"r"},
Usage: "restore backup",
Action: func(c *cli.Context) error {
cmdArgs := "devdb"
dropDB := ensurepath("dropdb")
//createDB := ensurepath("createdb")
outErrDrop, err := exec.Command(dropDB, cmdArgs).CombinedOutput()
checkout(err, outErrDrop)
//outErrCreate, createErr := exec.Command(createDB, cmdArgs).CombinedOutput()
//checkout(createErr, outErrCreate)
return nil
},
}
//output
2018/02/19 15:49:44 ensure path for command 'dropdb' : /usr/local/bin/dropdb
2018/02/19 15:49:44 command error exit status 1 : dropdb: database removal failed: ERROR: database "devdb" does not exist
但是如果引回对应于createdb部分的行(与我上面的第一个代码块完全相同),我得到以下结果:
2018/02/19 15:53:11 ensure path for command 'dropdb' : /usr/local/bin/dropdb
2018/02/19 15:53:11 ensure path for command 'createdb' : /usr/local/bin/createdb
2018/02/19 15:53:11 command result []uint8 :
2018/02/19 15:53:11 command result []uint8 :