回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,14 +1,14 @@
## 10.5. 包的匿名
## 10.5. 包的匿名
如果隻是導入一包而不使用入的包將會導致一個編譯錯誤。但是有候我們隻是想利用入包而生的副作用:它會計算包級變量的初始化表式和執行導入包的init初始化函§2.6.2)。這時候我需要抑“unused import”編譯錯誤,我可以用下劃線`_`重命名入的包。像往常一,下劃線`_`空白標識符,不能被訪問
如果只是导入一包而不使用入的包将会导致一个编译错误。但是有候我们只是想利用入包而生的副作用:它会计算包级变量的初始化表式和执行导入包的init初始化函§2.6.2)。这时候我需要抑“unused import”编译错误,我可以用下划线`_`重命名入的包。像往常一,下划线`_`空白标识符,不能被访问
```Go
import _ "image/png" // register PNG decoder
```
這個被稱爲包的匿名入。它通常是用來實現一個編譯時機製,然後通過在main主程序入口選擇性地入附加的包。首先,讓我們看看如何使用特性,然再看看它是如何工作的。
这个被称为包的匿名入。它通常是用来实现一个编译时机制,然后通过在main主程序入口选择性地入附加的包。首先,让我们看看如何使用特性,然再看看它是如何工作的。
標準庫的image像包包含了一`Decode`,用於從`io.Reader`接口讀取數據併解碼圖像,它調用底層註冊的圖像解碼器來完成任,然後返迴image.Image型的像。使用`image.Decode`很容易編寫一個圖像格式的轉換工具,取一格式的像,然後編碼爲另一種圖像格式:
标准库的image像包包含了一`Decode`,用于从`io.Reader`接口读取数据并解码图像,它用底层注册的图像解码器来完成任,然后返回image.Image型的像。使用`image.Decode`很容易编写一个图像格式的转换工具,取一格式的像,然后编码为另一种图像格式:
<u><i>gopl.io/ch10/jpeg</i></u>
```Go
@@ -42,7 +42,7 @@ func toJPEG(in io.Reader, out io.Writer) error {
}
```
如果我們將`gopl.io/ch3/mandelbrot`§3.3)的輸出導入到這個程序的標準輸入,它將解碼輸入的PNG格式像,然後轉換爲JPEG格式的圖像輸出(3.3)。
如果我们将`gopl.io/ch3/mandelbrot`§3.3)的输出导入到这个程序的标准输入,它将解码输入的PNG格式像,然后转换为JPEG格式的图像输出(3.3)。
```
$ go build gopl.io/ch3/mandelbrot
@@ -51,7 +51,7 @@ $ ./mandelbrot | ./jpeg >mandelbrot.jpg
Input format = png
```
意image/png包的匿名導入語句。如果沒有這一行句,程序依然可以編譯和運行,但是它不能正確識别和解PNG格式的像:
意image/png包的匿名导入语句。如果没有这一行句,程序依然可以编译和运行,但是它不能正确识别和解PNG格式的像:
```
$ go build gopl.io/ch10/jpeg
@@ -59,7 +59,7 @@ $ ./mandelbrot | ./jpeg >mandelbrot.jpg
jpeg: image: unknown format
```
下面的代演示了它的工作機製。標準庫還提供了GIF、PNG和JPEG等格式像的解器,用也可以提供自己的解器,但是了保持程序體積較小,很多解碼器併沒有被全部包含,除非是明需要支持的格式。image.Decode函在解碼時會依次査詢支持的格式列表。每格式驅動列表的每入口指定了四件事情:格式的名;一個用於描述這種圖像數據開頭部分模式的字符串,用於解碼器檢測識别;一Decode函數用於完成解碼圖像工作;一DecodeConfig函數用於解碼圖像的大小和色空的信息。每個驅動入口是通過調用image.RegisterFormat函數註冊,一般是在每格式包的init初始化函數中調例如image/png包是這樣註冊的:
下面的代演示了它的工作机制。标准库还提供了GIF、PNG和JPEG等格式像的解器,用也可以提供自己的解器,但是了保持程序体积较小,很多解码器并没有被全部包含,除非是明需要支持的格式。image.Decode函在解码时会依次查询支持的格式列表。每格式驱动列表的每入口指定了四件事情:格式的名;一个用于描述这种图像数据开头部分模式的字符串,用于解码器检测识别;一Decode函数用于完成解码图像工作;一DecodeConfig函数用于解码图像的大小和色空的信息。每个驱动入口是通过调用image.RegisterFormat函数注册,一般是在每格式包的init初始化函数中调例如image/png包是这样注册的:
```Go
package png // image/png
@@ -73,9 +73,9 @@ func init() {
}
```
的效果是,主程序需要匿名入特定圖像驅動包就可以用image.Decode解碼對應格式的像了。
的效果是,主程序需要匿名入特定图像驱动包就可以用image.Decode解码对应格式的像了。
數據庫包database/sql也是采用了似的技術,讓用戶可以根自己需要選擇導入必要的數據庫驅動。例如:
数据库包database/sql也是采用了似的技术,让用户可以根自己需要选择导入必要的数据库驱动。例如:
```Go
import (
@@ -89,6 +89,6 @@ db, err = sql.Open("mysql", dbname) // OK
db, err = sql.Open("sqlite3", dbname) // returns error: unknown driver "sqlite3"
```
**練習 10.1** 展jpeg程序以支持任意像格式之的相互轉換使用image.Decode檢測支持的格式型,然後通過flag命令行標誌參數選擇輸出的格式。
**练习 10.1** 展jpeg程序以支持任意像格式之的相互转换使用image.Decode检测支持的格式型,然后通过flag命令行标志参数选择输出的格式。
**練習 10.2** 設計一個通用的壓縮文件取框架,用來讀取ZIParchive/zip和POSIX tararchive/tar格式壓縮的文。使用似上面的註冊技術來擴展支持不同的壓縮格式,然後根據需要通匿名導入選擇導入要支持的壓縮格式的驅動包。
**练习 10.2** 设计一个通用的压缩文件取框架,用来读取ZIParchive/zip和POSIX tararchive/tar格式压缩的文。使用似上面的注册技术来扩展支持不同的压缩格式,然后根据需要通匿名导入选择导入要支持的压缩格式的驱动包。