在Go中,您沒有聲明您需要實現接口,您只需執行它(它被稱爲「結構類型」,類似於動態語言中的「duck typing」)。 如果你想強制一個類型實現一個接口(例如,當你在C#或Java中繼承一個接口),該怎麼辦?換句話說,如果忘記實現一個接口(或者弄錯簽名)是一個錯誤,你想盡早發現錯誤。什麼是最好的方式來做到這一點?你可以這樣做強制執行Go類型來實現接口
回答
最好的辦法是嘗試的類型的實例分配到要確保類型A
實現Stringer
接口變量
例如一個接口。
你可以做這樣的
var _ Stringer = new(A) //or
var _ Stringer = A{}
下面是示例程序,在這個例子中A
實現接口,B
不
package main
import (
"fmt"
)
type Stringer interface {
String() string
}
type A struct {
}
func (a A) String() string {
return "A"
}
type B struct {}
var _ Stringer = new(A)
var _ Stringer = new(B)
func main() {
fmt.Println("Hello, playground")
}
在這裏打球鏈接:play.golang
感謝@Sarathsp那個優雅的解決方案。我瞭解到,它有時被稱爲金絲雀測試(來自礦區貧民窟的金絲雀,會因煤氣中毒而快速死亡,以警告地雷)。 –
我假設虛擬變量將被編譯器丟棄,並且不消耗空間和CPU時間。我想,如果有疑問,它總是可以移動到_test.go文件。 –
這將被編譯器丟棄。移動到測試文件是你的電話,但我會建議把它放在那裏,因爲它使明確的實現要求:D, 順便說一句,你我的嘗試'var _ Stringer =(* A)(nil)'如果內存是關注:D –
要完成@Sarathsp說: 基本上,通過聲明一個虛擬變量(下劃線表示它不是而分配你的類型給它的一個實例的接口類型的使用),你會得到非常明確的編譯時錯誤:在您使用的類型所需的接口
type MyType struct {
}
func (*MyType) Read() {
}
var _ io.Reader = &MyType{}
cannot use MyType literal (type *MyType) as type io.Reader in assignment:
*MyType does not implement io.Reader (missing Read method)
Or
cannot use MyType literal (type *MyType) as type io.Reader in assignment:
*MyType does not implement io.Reader (wrong type for Read method)
have Read()
want Read([]byte) (int, error)
- 1. 強制執行Dart類型實現接口
- 2. 強制接口的子類實現ToString
- 3. 強制接口實現
- 4. 我應該使用接口來強制執行泛型嗎?
- 5. 確保類型在編譯時在Go中實現接口
- 6. 強制子類來實現成員類
- 7. 在接口中強制執行「等於」
- 8. 強制通用類型爲接口?
- 9. 的Flex「類型強制」鑄造接口
- 10. 在Go中強制映射類型
- 11. 解決方法來強制實現的接口屬性
- 12. 如果Go的接口沒有被強制執行,它們是否有必要?
- 13. 在ReSharper中強制執行成員選項以使用顯式接口實現
- 14. 爲toString強制執行類型簽名
- 15. 強制屬性加成用於實現接口的所有類
- 16. 接口強制抽象類實現其功能
- 17. 無法弄清楚如何使SWIG/Java強制代理類來實現接口
- 18. 強制一個動態加載的類來擴展或實現一個接口
- 19. 強制接口實現在c#中實現層次結構
- 20. 爲Map實現強制類型參數的屬性(如接口中)
- 21. 在從屬接口上強制實施參數類型?
- 22. 如何實現一個接口來處理類型轉換類?
- 23. 實現接口類的類下的代碼不執行
- 24. Java抽象類聲明throwable - 實現不強制執行它?
- 25. 使用Scala的宏來強制執行類型相等
- 26. 強類型DataSet列需要自定義類型來實現IXmlSerializable?
- 27. BreezeJS/ODATA:只能對實體類型執行強制轉換
- 28. 確定類型實現的接口
- 29. 綁定類型暗示接口實現
- 30. 實現與不同類型的接口
寫一個測試。除非類型實現上述接口,否則測試不會通過。 – ain