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

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

golang源碼為什么要這樣寫

golang源碼為什么要這樣寫

Go
慕妹3146593 2023-03-21 17:09:39
我看到了一些golang代碼,但我不知道它是如何工作的!有人認識嗎?為什么要這樣寫?var _ errcode.ErrorCode = (*StoreTombstonedErr)(nil) // assert implements interface var _ errcode.ErrorCode = (*StoreBlockedErr)(nil)    // assert implements interface源代碼鏈接是https://github.com/pingcap/pd/blob/0e216a703776c51cb71f324c36b6b94c1d25b62f/server/core/errors.go#L37
查看完整描述

1 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

這用于檢查類型 T 是否實現接口 I。


var _ errcode.ErrorCode = (*StoreTombstonedErr)(nil) // assert implements interface

var _ errcode.ErrorCode = (*StoreBlockedErr)(nil) 

在上面的代碼片段中,第一行檢查StoreTombstonedErrimplmenetserrcode.ErrorCode


雖然第二行檢查*StoreBlockedErr實現了errcode.ErrorCode.


您可以要求編譯器檢查類型 T 是否實現了接口 I,方法是嘗試使用 T 的零值或指向 T 的指針進行賦值,視情況而定:


type T struct{}

var _ I = T{}       // Verify that T implements I.

var _ I = (*T)(nil) // Verify that *T implements I.

如果 T(或相應的 *T)沒有實現 I,錯誤將在編譯時被捕獲。


如果您希望接口的用戶明確聲明他們實現了它,您可以將具有描述性名稱的方法添加到接口的方法集中。例如:


type Fooer interface {

    Foo()

    ImplementsFooer()

}

然后一個類型必須實現 ImplementsFooer 方法才能成為 Fooer


type Bar struct{}

func (b Bar) ImplementsFooer() {}

func (b Bar) Foo() {}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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