標籤:

golang寫法疑問?

這個ver i int 然後 _=i 是什麼目的呀?有什麼作用?


因為未使用的變數會報錯,不能編譯,所以用 _ = XXX 來「使用」這個變數,使其通過編譯。

為什麼用到了 i 變數,還是有 _ = i 這句呢?因為這段代碼是用程序生成的,生成器為了方便處理,直接加了這句。例如 l,在這個方法里就沒有用到,但因為有 _ = l,所以不影響編譯。

這個方法叫 MarshalTo,就更可能是用代碼生成的。很多編碼解碼庫都是通過生成代碼,而不是用反射來處理各個欄位,這樣效率會比較高。

代碼生成器可以做精細些,用到的變數就不生成 _ = XXX。但是實現起來當然會麻煩些,而且沒有明顯的益處。_ = XXX 這句會被優化掉的,不影響什麼。

平時調試也會用到這個方法來「使用」一個變數,不過調試完肯定清理掉的,不會像自動生成的代碼那樣留下痕迹。

還有一種使用場景是,在編譯期就確保某個類型實現某個介面,例如確保 Foo 類型實現 io.Writer 介面:

var _ io.Writer = Foo{}

如果 Foo 類型沒有實現 io.Writer 介面,那編譯就會失敗,而不是等到執行時。


Go語言不允許未使用的變數和包,但如果把它們賦值給_(空標識),編譯器就會認為它們已使用,編譯時就不會報錯。也有人用_(空標識)讓編譯器在編譯時,確保一個類型執行了一定的介面。但圖片中的那種用法,沒接觸過。如果這段代碼是 GitHub 的項目中的代碼,可以直接問問寫代碼的人。


Go編譯器不允許定義但不使用的變數,這個就是用特殊的下劃線給這個變數,讓編譯通過

舉個例子

```

var i int

```

直接編譯肯定會報錯,但是

```

var i int

_ = i

```

就不會報錯


這種類型的代碼,見過不少,但實在說不出來這種代碼是什麼意思,有什麼作用,希望有大神出來解釋一下。

少用這種奇技淫巧


推薦閱讀:

王垠噴 Go 語言,許式偉贊 Go 語言,大家怎麼看?
標準庫bytes包中,Buffer對象的ReadRune方法如何用...?
golang 想要持久的火起來,該怎麼做?
Go 1.7.6 和 1.8.2 雙版本發布,GO語言開發團隊為什麼要維護一個較低的歷史版?

TAG:Go語言 |