gopl-zh.github.com/ch10/ch10-01.md
2016-01-08 14:25:36 +08:00

2.1 KiB
Raw Blame History

10.1. 包簡介

任何包繫統設計的目的都是爲了簡化大型程序的設計和維護工作,通過將一組相關的特性放進一個獨立的單元以便於理解和更新,在每個單元更新的同時保持和程序中其它單元的相對獨立性。這種模塊化的特性允許每個包可以被其它的不同項目共享和重用,在項目范圍內、甚至全球范圍統一的分發和複用。

每個包一般都定義了一個不同的名字空間用於它內部的每個標識符的訪問。每個名字空間關聯到一個特定的包,讓我們給類型、函數等選擇簡短明了的名字,這樣可以避免在我們使用它們的時候減少和其它部分名字的衝突。

每個包還通過控製包內名字的可見性和是否導出來實現封裝特性。通過限製包成員的可見性併隱藏包API的具體實現將允許包的維護者在不影響外部包用戶的前提下調整包的內部實現。通過限製包內變量的可見性還可以強製用戶通過某些特定函數來訪問和更新內部變量這樣可以保證內部變量的一致性和併發時的互斥約束。

當我們脩改了一個源文件我們必鬚重新編譯該源文件對應的包和所有依賴該包的其他包。卽使是從頭構建Go語言編譯器的編譯速度也明顯快於其它編譯語言。Go語言的閃電般的編譯速度主要得益於三個語言特性。第一點所有導入的包必鬚在每個文件的開頭顯式聲明這樣的話編譯器就沒有必要讀取和分析整個源文件來判斷包的依賴關繫。第二點禁止包的環狀依賴因爲沒有循環依賴包的依賴關繫形成一個有向無環圖每個包可以被獨立編譯而且很可能是被併發編譯。第三點編譯後包的目標文件不僅僅記録包本身的導出信息目標文件同時還記録了包的依賴關繫。因此在編譯一個包的時候編譯器隻需要讀取每個直接導入包的目標文件而不需要遍歷所有依賴的的文件譯註很多都是重複的間接依賴