go 里的预先写一堆 `_ type = struct{}` 的目的是什么

2022-05-20 17:59:26 +08:00
 dzdh

比如 gin/redner/render.go

var (
	_ Render     = JSON{}
	_ Render     = IndentedJSON{}
	_ Render     = SecureJSON{}
	_ Render     = JsonpJSON{}
	_ Render     = XML{}
	_ Render     = String{}
	_ Render     = Redirect{}
	_ Render     = Data{}
	_ Render     = HTML{}
	_ HTMLRender = HTMLDebug{}
	_ HTMLRender = HTMLProduction{}
	_ Render     = YAML{}
	_ Render     = Reader{}
	_ Render     = AsciiJSON{}
	_ Render     = ProtoBuf{}
)

预先写这一堆的目的是什么呢?

2816 次点击
所在节点    Go 编程语言
9 条回复
qi1070445109
2022-05-20 18:00:32 +08:00
判断实现了 render interface
yujianwjj
2022-05-20 18:01:50 +08:00
验证 JSON 这个结构体是否实现了 Render 这个接口。如果没有实现的话,在编译的时候会报错。
Norths
2022-05-20 18:03:00 +08:00
Render 是个接口吧?为了检查是否实现了相关方法
iamzuoxinyu
2022-05-20 18:09:48 +08:00
相当于 static_assert ,脱裤子放屁之举。
dzdh
2022-05-20 18:12:33 +08:00
明白了。
。。一时半会儿没转过来。就是用 IDE 的时候,实现没实现在用的时候立刻就能知道了。
这是防止“出错”是吧
Buges
2022-05-20 18:26:56 +08:00
不愧是大道至简
MiketsuSmasher
2022-05-20 23:17:16 +08:00
可能相当于 python 里通过判断 `print 'hello world'` 这种语句能否执行,进而判断当前 python 版本?

>>> try:
... exec("print 'hello world'")
... except SyntaxError:
... py_version = 3
... else:
... py_version = 2
...
>>>
acehowxx
2022-05-20 23:53:07 +08:00
因为接口是鸭子类型。灵活是灵活,但有时想编译阶段就能显示判断是否结构体实现了接口,就有了这种写法。我觉得还是不错的。在有了泛型后,go 现在最大的诟病就是错误处理的样板戏了,其实就用?判断 error 不为空就往上抛就完事了,不知道为什么拖到现在都不愿意去弄。国产七牛魔改的 go+早好几年前错误处理就这么干了。
chinaliuhan
2022-05-22 19:56:58 +08:00
@acehowxx 大佬, 这个写法叫什么名字?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854247

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX