如何确保类型在编译时实现接口?这样做的典型方法是通过未能分配支持该类型的接口,但是我有几种只能动态转换的类型。在运行时,这会产生非常粗糙的错误消息,而没有针对编译时错误给出更好的诊断。在运行时发现我期望支持接口的类型也很不方便,事实上并非如此。确保类型在编译时在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