比如 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{}
)
预先写这一堆的目的是什么呢?
1
qi1070445109 2022-05-20 18:00:32 +08:00 via Android
判断实现了 render interface
|
2
yujianwjj 2022-05-20 18:01:50 +08:00
验证 JSON 这个结构体是否实现了 Render 这个接口。如果没有实现的话,在编译的时候会报错。
|
3
Norths 2022-05-20 18:03:00 +08:00
Render 是个接口吧?为了检查是否实现了相关方法
|
4
iamzuoxinyu 2022-05-20 18:09:48 +08:00
相当于 static_assert ,脱裤子放屁之举。
|
5
dzdh OP 明白了。
。。一时半会儿没转过来。就是用 IDE 的时候,实现没实现在用的时候立刻就能知道了。 这是防止“出错”是吧 |
6
Buges 2022-05-20 18:26:56 +08:00 via Android
不愧是大道至简
|
7
MiketsuSmasher 2022-05-20 23:17:16 +08:00 via Android
可能相当于 python 里通过判断 `print 'hello world'` 这种语句能否执行,进而判断当前 python 版本?
>>> try: ... exec("print 'hello world'") ... except SyntaxError: ... py_version = 3 ... else: ... py_version = 2 ... >>> |
8
acehowxx 2022-05-20 23:53:07 +08:00 via Android
因为接口是鸭子类型。灵活是灵活,但有时想编译阶段就能显示判断是否结构体实现了接口,就有了这种写法。我觉得还是不错的。在有了泛型后,go 现在最大的诟病就是错误处理的样板戏了,其实就用?判断 error 不为空就往上抛就完事了,不知道为什么拖到现在都不愿意去弄。国产七牛魔改的 go+早好几年前错误处理就这么干了。
|
9
chinaliuhan 2022-05-22 19:56:58 +08:00
@acehowxx 大佬, 这个写法叫什么名字?
|