我正在創(chuàng)建一個(gè)自定義錯(cuò)誤并將其用作函數(shù)返回:type MyError struct { Name string}func (me *MyError) Error() string { return me.Name + " is my error"}返回自定義錯(cuò)誤的函數(shù):func (anyStruct *AnyStruct) Validate() error { // if Any verification { return &MyError{Name: "MyError"} //}}為什么我不能作為值而不是引用返回?如果我嘗試作為值返回:return MyError{Name: "MyError"}編輯器的 linter 抱怨一個(gè)錯(cuò)誤:不能使用(MyError 文字)(MyError 類型的值)作為返回語句中的錯(cuò)誤值:缺少方法錯(cuò)誤此外,我對(duì)返回引用但函數(shù)簽名沒有通知將返回指針這一事實(shí)感到困惑:func (anyStruct *AnyStruct) Validate() error {代替func (anyStruct *AnyStruct) Validate() *error {
1 回答

尚方寶劍之說
TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
error是一個(gè)接口類型,因此可以用作錯(cuò)誤的類型必須實(shí)現(xiàn)該Error()方法。您的代碼中實(shí)現(xiàn)的類型Error()是*MyError(即指向MyError 的指針)。返回時(shí)Validate(),返回值被隱式轉(zhuǎn)換為錯(cuò)誤 - 只有*MyError(而不是MyError)可以轉(zhuǎn)換為error.
要執(zhí)行您想要的操作,您應(yīng)該使用MyErrorimplement Error()。
func (me MyError) Error() string {
return me.Name + " is my error"
}
請(qǐng)注意,如果函數(shù)返回error返回值,則返回的任何類型都將存儲(chǔ)在接口中(記住error是接口類型)。和大多數(shù)類型一樣,指針可以存儲(chǔ)在接口中。還要小心使用“引用”類型這個(gè)詞——在 Go 中,它通常指的是內(nèi)部包含指針的類型(接口、映射等),盡管我猜它也包括指針。
- 1 回答
- 0 關(guān)注
- 123 瀏覽
添加回答
舉報(bào)
0/150
提交
取消