V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dzdh
V2EX  ›  Go 编程语言

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

  •  
  •   dzdh · 2022-05-20 17:59:26 +08:00 · 2816 次点击
    这是一个创建于 922 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 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{}
    )
    

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

    9 条回复    2022-05-22 19:56:58 +08:00
    qi1070445109
        1
    qi1070445109  
       2022-05-20 18:00:32 +08:00 via Android
    判断实现了 render interface
    yujianwjj
        2
    yujianwjj  
       2022-05-20 18:01:50 +08:00
    验证 JSON 这个结构体是否实现了 Render 这个接口。如果没有实现的话,在编译的时候会报错。
    Norths
        3
    Norths  
       2022-05-20 18:03:00 +08:00
    Render 是个接口吧?为了检查是否实现了相关方法
    iamzuoxinyu
        4
    iamzuoxinyu  
       2022-05-20 18:09:48 +08:00
    相当于 static_assert ,脱裤子放屁之举。
    dzdh
        5
    dzdh  
    OP
       2022-05-20 18:12:33 +08:00
    明白了。
    。。一时半会儿没转过来。就是用 IDE 的时候,实现没实现在用的时候立刻就能知道了。
    这是防止“出错”是吧
    Buges
        6
    Buges  
       2022-05-20 18:26:56 +08:00 via Android
    不愧是大道至简
    MiketsuSmasher
        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
    ...
    >>>
    acehowxx
        8
    acehowxx  
       2022-05-20 23:53:07 +08:00 via Android
    因为接口是鸭子类型。灵活是灵活,但有时想编译阶段就能显示判断是否结构体实现了接口,就有了这种写法。我觉得还是不错的。在有了泛型后,go 现在最大的诟病就是错误处理的样板戏了,其实就用?判断 error 不为空就往上抛就完事了,不知道为什么拖到现在都不愿意去弄。国产七牛魔改的 go+早好几年前错误处理就这么干了。
    chinaliuhan
        9
    chinaliuhan  
       2022-05-22 19:56:58 +08:00
    @acehowxx 大佬, 这个写法叫什么名字?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.