今天在看 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 方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。