今天在看 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 方法。開發