Mat*_*ner 15 types compiler-errors interface go
如何确保类型在编译时实现接口?执行此操作的典型方法是无法从该类型分配支持接口,但是我有几种仅动态转换的类型.在运行时,这会生成非常粗暴的错误消息,而没有为编译时错误提供更好的诊断.在运行时找到我希望支持接口的类型也很不方便,事实上并非如此.
zzz*_*zzz 15
假设问题是关于Go,例如
var _ foo.RequiredInterface = myType{} // or &myType{} or [&]myType if scalar
Run Code Online (Sandbox Code Playgroud)
作为TLD将在编译时为您检查.
编辑:s/[*] /&/
EDIT2:s/dummy/_ /,谢谢Atom
在Go语言中,没有设计的" 实现 "声明.要求编译器通过尝试赋值来检查类型T是否实现接口I的唯一方法(是的,虚拟的:).注意,Go lang区分结构和指针上声明的方法,在赋值检查中使用正确的方法!
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
Run Code Online (Sandbox Code Playgroud)
阅读常见问题解答详情为什么Go没有"实施"声明?
通过@smile-on 扩展答案。
在我如何保证我的类型满足接口?,这是Go 作者的常见问题 (FAQ)的一部分,声明如下:
您可以要求编译器检查该类型是否
T
实现了接口,方法I
是尝试使用 0 值T
或指向 的指针T
(视情况而定)。
我们可以用一个例子来说明这一点:
package main
type I interface{ M() }
type T struct{}
func (T) M() {}
//func (*T) M() {} //var _ I = T{}: T does not implement I (M method has pointer receiver)
func main() {
//avoids allocation of memory
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
//allocation of memory
var _ I = &T{} // Verify that &T implements I.
var _ I = new(T) // Verify that new(T) implements I.
}
Run Code Online (Sandbox Code Playgroud)
如果T
(或*T
,相应地)没有实现I
,错误将在编译时被捕获。请参阅接口实现中的非接口方法。
通常,如果您不知道某个值的类型,则检查该值是否实现了接口。如果已知,则检查由编译器自动完成。请参阅检查值是否实现接口的说明。
空白标识符_
代表变量名,这里不需要它(从而防止“声明但未使用”错误)。通过转换为 来(*T)(nil)
创建一个指向类型值的未初始化指针。请参阅理解一段 golang 代码时遇到问题。T
nil
*T
例如,这与在为其var t *T
分配任何内容之前具有的值相同。请参阅golang 接口合规性编译类型检查。这避免了像使用&T{}
or那样为空结构分配内存new(T)
。请参阅理解一段 golang 代码时遇到问题。
行情编辑以匹配示例。
归档时间: |
|
查看次数: |
4270 次 |
最近记录: |