今天在看 Gin 框架的时候,跟踪 Gin 在处理接口返回时,使用到了一个 render 包,查看代码的过程当中,发现了这样的写法:git
// 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 循环的遍历中常常见到:code
for _, v := range result { }
还有就是忽略函数的返回值,也很常见。接口
偶尔会看到在 import 数据包的时候,存在下面的方式:ci
import _ "githu.com/think-next"
这种方式是为了执行包内的 init 函数。对咱们的代码而言,这个包没有一点用处,除了它内部的 init 方法。开发