确保类型在Go中的编译时实现接口

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

  • 你可以写`_`而不是`dummy`. (4认同)
  • 我对你的sed风格的编辑符号很感兴趣. (3认同)

smi*_*-on 6

在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没有"实施"声明?

  • [http://play.golang.org/p/UNXt7MlmX8](http://play.golang.org/p/UNXt7MlmX8) 强调指针和结构体赋值检查的区别 (2认同)

Tom*_*m L 5

通过@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 代码时遇到问题Tnil*T

例如,这与在为其var t *T分配任何内容之前具有的值相同。请参阅golang 接口合规性编译类型检查。这避免了像使用&T{}or那样为空结构分配内存new(T)。请参阅理解一段 golang 代码时遇到问题

行情编辑以匹配示例。