亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 golang 中使用空白標識符導入的用例

在 golang 中使用空白標識符導入的用例

Go
函數式編程 2021-08-30 16:32:43
Go 編程語言規范指出:“要僅為其副作用(初始化)導入包,請使用空白標識符作為顯式包名稱?!崩纾篿mport _ "foo/bar"我很難想象這個構造的用例。對“import”語句的使用的公認答案提到了一個用例,其中可以加載數據庫驅動程序而無需導入程序使用該包的任何導出函數,但它忽略了讀者想象的細節。是否有現實生活中的例子(帶有代碼片段和解釋)來說明這個用例?
查看完整描述

3 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

我正在編寫一個調整圖像大小的程序。我希望它能夠識別不同格式的圖像,如JPEG、PNG、GIF并將它們轉換為JPEG。


所以除了image和image/jpeg包,我還必須導入image/png并且image/gif只注冊它們各自的解碼器。


如果我沒有導入這些,縮放器將只能讀取JPEG圖像。


package main


import(

  "image"

  "image/jpeg" // I wanted to export the images as JPEG

  _ "image/png"

  _ "image/gif"

)


// ...

image包中的相關文檔:


解碼任何特定的圖像格式需要預先注冊解碼器功能。作為初始化該格式的包的副作用,注冊通常是自動的,因此,要解碼 PNG 圖像,它就足夠了:


import _ "image/png"


查看完整回答
反對 回復 2021-08-30
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

這是因為init 函數


每個源文件都可以定義自己的 niladicinit函數來設置所需的任何狀態。(其實每個文件可以有多種init功能。)


finally 的意思是 finally:init在包中的所有變量聲明都評估了它們的初始值設定項之后調用,并且只有在所有導入的包都已初始化之后才評估它們。


這就是“ Go 中 import 語句前面的下劃線是什么意思”中提到的go-sqlite3 的工作原理。


func init() {

    sql.Register("sqlite3", &SQLiteDriver{})

}

你在“理解 Golang Packagese ”中有另一個例子:


在某些情況下,我們可能只需要導入一個包來調用它的init方法,而我們不需要調用包的其他方法。

如果我們導入了一個包并且沒有在程序中使用包標識符,Go 編譯器將顯示錯誤。

在這種情況下,我們可以使用一個空白標識符 ( _) 作為包別名,這樣編譯器會忽略不使用包標識符的錯誤,但仍然會調用該init函數。


查看完整回答
反對 回復 2021-08-30
  • 3 回答
  • 0 關注
  • 310 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號