這裏有兩個不同的問題:
第一個問題:實際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