这里有两个不同的问题:
第一个问题:实际error
类型实际上是一个内置-in界面。为了实现它,你需要实现一个类型为func Error() string
的方法。所以error
类型的任何东西都可以通过调用它的Error
函数转换为字符串格式。
第二个问题:panic
不参加error
,它需要interface{}
。内建的recover
类似地返回您传递给panic
的任何interface{}
。在这种情况下,拨打Error
将不起作用。事实上,你没有通过error
到panic
,你通过了string
(这很常见)。
有很多方法可以从interface{}
获得string
,而大型开关是一个。但总体来说,我认为最简单的选择是
myBytes := []byte(fmt.Sprintf("%s%v", prefix_err, err))
这将永远得到任何接口的字符串表示{}是,呼吁String()
或必要Error()
,然后将其转换成[]byte
。
(小脚注:它不被认为是在变量名中使用下划线的Go风格,而是使用camelCase代替)。
编辑:
既然事实证明我们有一个部分的“X Y问题”与转换为[]byte
写为io.Writer
。如果您想将此日志记录到Stderr,则可以使用fmt.Fprintf(os.Stderr, "%s%v\n", prefix_err, err)
甚至fmt.Fprintln(os.Stderr, prefix_err, err)
。任何Fprint
将正确打印到任何io.Writer
,包括日志文件。
出于好奇,为什么你需要'[]字节'的错误?我唯一的猜测就是你想把它写入一个文件,'io.Writer'需要一个'[]字节'。如果是这样,有更简单的接口可以接受字符串。 – LinearZoetrope 2014-09-27 20:09:37
你是什么意思?是的,我正在写'os.Stderr'和一个文件 – clarkk 2014-09-27 20:16:48
使用'fmt.Fprint [ln | f](io.Stderr,“我的字符串”)'事实上,你可以用'fmt.Fprintf (io.Stderr,“%s%v \ n”,prefix_err,err)' – LinearZoetrope 2014-09-27 20:18:25