明天在看 Gin 框架的时候,跟踪 Gin 在解决接口返回时,应用到了一个 render 包,查看代码的过程中,发现了这样的写法:

// Render interface is to be implemented by JSON, XML, HTML, YAML and so on.type Render interface {    // Render writes data with custom ContentType.    Render(http.ResponseWriter) error    // WriteContentType writes custom ContentType.    WriteContentType(w http.ResponseWriter)}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{})

第一眼看上去还挺奇怪的,_ 的作用就是疏忽,作者这么写有什么意义吗?代码中 Render 是一个接口类型,这种赋值隐含实现了接口的类型断言:左边的数据类型是否实现了右边的接口类型,如果没有实现,则会报编译谬误。

这种写法还是挺稳当的,后续开发中能够其实能够借鉴。在 Go 中还有哪些应用 _ 的场景吗?

疏忽函数的返回值

这是最常见的应用形式,在 for 循环的遍历中常常见到:

for _, v := range result {    }

还有就是疏忽函数的返回值,也很常见。

在 import 包的时候应用

偶然会看到在 import 数据包的时候,存在上面的形式:

import _ "githu.com/think-next"

这种形式是为了执行包内的 init 函数。对咱们的代码而言,这个包没有一点用途,除了它外部的 init 办法。