如何確保類型在編譯時實現接口?這樣做的典型方法是通過未能分配支持該類型的接口,但是我有幾種只能動態轉換的類型。在運行時,這會產生非常粗糙的錯誤消息,而沒有針對編譯時錯誤給出更好的診斷。在運行時發現我期望支持接口的類型也很不方便,事實上並非如此。確保類型在編譯時在Go中實現接口
回答
假設問題與Go有關,例如
var _ foo.RequiredInterface = myType{} // or &myType{} or [&]myType if scalar
作爲頂級域名將在編譯時檢查。
編輯:S/[*]/&/
EDIT2:S /虛擬/ _ /,由於凌動
你可以寫'_'而不是'dummy'。 – 2012-05-08 14:22:34
我很喜歡你的sed風格的編輯符號。 – Matt
像這樣:
http://play.golang.org/p/57Vq0z1hq0
package main
import(
"fmt"
)
type Test int
func(t *Test) SayHello() {
fmt.Println("Hello");
}
type Saluter interface{
SayHello()
SayBye()
}
func main() {
t := Saluter(new(Test))
t.SayHello()
}
將產生:
prog.go:19: cannot convert new(Test) (type *Test) to type Saluter:
*Test does not implement Saluter (missing SayBye method)
我不喜歡通過在主代碼中放置虛擬行來產生編譯器拋出錯誤的想法。這是一個很有效的解決方案,但我更願意爲此寫一個測試。
假設我們有:
type Intfc interface { Func() }
type Typ int
func (t Typ) Func() {}
此測試確保Typ
實現Intfc
:
package main
import (
"reflect"
"testing"
)
func TestTypes(t *testing.T) {
var interfaces struct {
intfc Intfc
}
var typ Typ
v := reflect.ValueOf(interfaces)
testType(t, reflect.TypeOf(typ), v.Field(0).Type())
}
// testType checks if type t1 implements interface t2
func testType(t *testing.T, t1, t2 reflect.Type) {
if !t1.Implements(t2) {
t.Errorf("%v does not implement %v", t1, t2)
}
}
您可以將它們添加到TestTypes
功能檢查所有的類型和接口。爲Go編寫測試介紹here。
package main
import (
"fmt"
)
type Sayer interface {
Say()
}
type Person struct {
Name string
}
func(this *Person) Say() {
fmt.Println("I am", this.Name)
}
func main() {
person := &Person{"polaris"}
Test(person)
}
func Test(i interface{}) {
//!!here ,judge i implement Sayer
if sayer, ok := i.(Sayer); ok {
sayer.Say()
}
}
的代碼示例是在這裏:http://play.golang.org/p/22bgbYVV6q
在圍棋的語言中沒有 「工具」 聲明的設計。要求編譯器通過嘗試賦值來檢查類型T是否實現接口I的唯一方法(是的,一個虛擬的:)。注意,Go lang區分在結構和指針上聲明的方法,在分配檢查中使用正確的!
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
[http://play.golang.org/p/UNXt7MlmX8](http://play.golang。org/p/UNXt7MlmX8)突出顯示指針和結構賦值檢查之間的區別 –
- 1. 如何確保字段在編譯時實現接口
- 2. 在編譯時確保互斥接口?
- 3. 確保實現接口和繼承時的參數類型
- 4. 如何在Java 8編譯時確保方法簽名「實現」功能接口
- 5. 創建(=編譯)在運行時類,它實現已知接口
- 6. 不能編譯它實現的接口中,無類型參數
- 7. C++編譯時接口實現檢查
- 8. 檢查一個接口是否在編譯時通過一個類型實現
- 9. 確定類型實現的接口
- 10. 強制執行Go類型來實現接口
- 11. 如何實現在編譯時不可用的接口
- 12. Android - 在編譯時使用未知實現的Java接口
- 13. 如何確保類註解參數在編譯時擴展接口?
- 14. 在編譯時按類型推斷接口
- 15. F#編譯錯誤實現C#接口
- 16. 無法編譯實現了接口類的java類
- 17. 如何獲取Go中實現接口的包中定義的所有類型?
- 18. 正確類型進口零部件不共享接口實現
- 19. 在C#中實現一個.NET接口實例化IronPython類型
- 20. 在TypeScript中實現接口的原型
- 21. 在Go中,類型和指向一個類型的指針都可以實現一個接口嗎?
- 22. 在類型中查找直接實現的接口
- 23. 在實現接口時擴展包含類型
- 24. 如何確定類型是否實現Powershell中的接口
- 25. 編譯器不識別實現文件中的類成員函數類型,但在接口文件中識別
- 26. 接口實現時不透露實現接口的類
- 27. 如何在java中實現接口類
- 28. 在鏈表類中實現Iterator接口
- 29. 在VB類中實現C#接口
- 30. 通用類型從實現中的泛型類型的接口
在什麼語言? – EJP
@EJP:應該是_go_,谷歌語言 – themarcuz