亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

syscall.Errno 中的字符串函數

syscall.Errno 中的字符串函數

Go
幕布斯7119047 2023-05-15 09:49:24
通讀“The Go Programming Language”的 7.8 部分,我發現了以下代碼:var err error = syscall.Errno(2) fmt.Println(err.Error()) // "no such file or directory" fmt.Println(err)         // "no such file or directory"我理解第一行和第二行。error接口由 滿足syscall.Errno,因此Error()函數返回string是可用的。第三個沒看懂 通過syscall的來源,我找不到任何syscall.Errno滿足stringer接口的地方 -String()未定義功能。為什么第三個打印字符串表示形式sysscall.Errno?
查看完整描述

1 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

答案可在此處的fmt文檔中找到:

如果格式(對于 Println 等隱式為 %v)對于字符串有效(%s %q %v %x %X),則適用以下兩個規則:

  1. 如果操作數實現了錯誤接口,將調用 Error 方法將對象轉換為字符串,然后根據動詞(如果有)的要求對其進行格式化。

  2. 如果一個操作數實現了 String() string 方法,將調用該方法將對象轉換為字符串,然后根據動詞(如果有)的要求對其進行格式化。

所以實際上,對于同時支持兩者的任何值,String()根本不會調用該方法,因為error接口優先于Stringer接口。您可以使用這樣的程序進行測試:

package main


import (

? ? "fmt"

)


type foo string


func (f foo) String() string {

? ? return "string"

}


func (f foo) Error() string {

? ? return "error"

}


func main() {

? ? fmt.Println(foo(""))

}

輸出:


error


查看完整回答
反對 回復 2023-05-15
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號