GoLang下劃線總結

今天在看 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 包的時候使用

偶爾會看到在 import 數據包的時候,存在下面的方式:ci

import _ "githu.com/think-next"

這種方式是爲了執行包內的 init 函數。對咱們的代碼而言,這個包沒有一點用處,除了它內部的 init 方法。開發

相關文章
相關標籤/搜索