From c7cbd15c1e814493a397b270d9e493131800843c Mon Sep 17 00:00:00 2001 From: chai2010 Date: Fri, 8 Jan 2016 14:25:36 +0800 Subject: [PATCH] ch10-1: review --- SUMMARY-github.md | 2 +- SUMMARY.md | 2 +- ch10/ch10-01.md | 12 +++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/SUMMARY-github.md b/SUMMARY-github.md index 515d37e..e9a39e2 100644 --- a/SUMMARY-github.md +++ b/SUMMARY-github.md @@ -125,7 +125,7 @@ * [9.8.3. GOMAXPROCS](ch9/ch9-08-3.md) * [9.8.4. Goroutine沒有ID號](ch9/ch9-08-4.md) * [第十章 包和工具](ch10/ch10.md) - * [10.1. 簡介](ch10/ch10-01.md) + * [10.1. 包簡介](ch10/ch10-01.md) * [10.2. 導入路徑](ch10/ch10-02.md) * [10.3. 包聲明](ch10/ch10-03.md) * [10.4. 導入聲明](ch10/ch10-04.md) diff --git a/SUMMARY.md b/SUMMARY.md index da71f78..813f51e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -92,7 +92,7 @@ * [示例: 併發的非阻塞緩存](ch9/ch9-07.md) * [Goroutines和線程](ch9/ch9-08.md) * [包和工具](ch10/ch10.md) - * [簡介](ch10/ch10-01.md) + * [包簡介](ch10/ch10-01.md) * [導入路徑](ch10/ch10-02.md) * [包聲明](ch10/ch10-03.md) * [導入聲明](ch10/ch10-04.md) diff --git a/ch10/ch10-01.md b/ch10/ch10-01.md index d856835..5b6793e 100644 --- a/ch10/ch10-01.md +++ b/ch10/ch10-01.md @@ -1,11 +1,9 @@ -## 10.1. 簡介 +## 10.1. 包簡介 -任何包繫統設計的目的都是爲了使大型程序的設計和維護, 通過將一組相關的特性放進一個獨立的單元以便於理解和更新, 同時保持和程序中其他單元的相對獨立性. 這種模塊化的特性允許每個包可以被其他的不同項目共享和重用, 在項目內甚至全球統一的分發. +任何包繫統設計的目的都是爲了簡化大型程序的設計和維護工作,通過將一組相關的特性放進一個獨立的單元以便於理解和更新,在每個單元更新的同時保持和程序中其它單元的相對獨立性。這種模塊化的特性允許每個包可以被其它的不同項目共享和重用,在項目范圍內、甚至全球范圍統一的分發和複用。 -每個包定義了一個不同的名稱空間用於它內部的每個標識符. 每個名稱關聯到一個特定的包, 我們最好給類型, 函數等選擇簡短清晰的名字, 這樣可以避免在我們使用它們的時候減少和其他部分名字的衝突. - -包還通過控製包內名字的可見性和是否導出來實現封裝特性. 通過限製包成員的可見性併隱藏包API的具體實現, 將允許包的維護者在不影響外部包用戶的前提下調整包的內部實現. 通過限製包內變量的可見性, 還可以控製用戶通過某些特定函數來訪問和更新內部變量, 這樣可以保證內部變量的一致性和併發時的互斥約束. - -當我們脩改了一個文件, 我們必鬚重新編譯改文件對應的包和所以依賴該包的其他包.卽使是從頭構建, Go的編譯器也明顯快於其他編譯語言. Go的編譯速度主要得益於三個特性. 第一點, 所有導入的包必鬚在每個文件的開頭顯式聲明, 這樣的話編譯器就沒有必要讀取分析整個文件來判斷包的依賴關繫. 第二點, 包的依賴關繫形成一個有向無環圖, 因爲沒有循環依賴, 每個包可以被獨立編譯, 很可能是併發編譯. 第三點, 編譯後包的目標文件不僅僅記録包本身的導出信息, 同時還記録了它的依賴關繫. 因此, 在編譯一個包的時候, 編譯器隻需要讀取每個直接導入包的目標文件, 而不是要遍歷所有依賴的的文件(譯註: 很多可能是間接依賴). +每個包一般都定義了一個不同的名字空間用於它內部的每個標識符的訪問。每個名字空間關聯到一個特定的包,讓我們給類型、函數等選擇簡短明了的名字,這樣可以避免在我們使用它們的時候減少和其它部分名字的衝突。 +每個包還通過控製包內名字的可見性和是否導出來實現封裝特性。通過限製包成員的可見性併隱藏包API的具體實現,將允許包的維護者在不影響外部包用戶的前提下調整包的內部實現。通過限製包內變量的可見性,還可以強製用戶通過某些特定函數來訪問和更新內部變量,這樣可以保證內部變量的一致性和併發時的互斥約束。 +當我們脩改了一個源文件,我們必鬚重新編譯該源文件對應的包和所有依賴該包的其他包。卽使是從頭構建,Go語言編譯器的編譯速度也明顯快於其它編譯語言。Go語言的閃電般的編譯速度主要得益於三個語言特性。第一點,所有導入的包必鬚在每個文件的開頭顯式聲明,這樣的話編譯器就沒有必要讀取和分析整個源文件來判斷包的依賴關繫。第二點,禁止包的環狀依賴,因爲沒有循環依賴,包的依賴關繫形成一個有向無環圖,每個包可以被獨立編譯,而且很可能是被併發編譯。第三點,編譯後包的目標文件不僅僅記録包本身的導出信息,目標文件同時還記録了包的依賴關繫。因此,在編譯一個包的時候,編譯器隻需要讀取每個直接導入包的目標文件,而不需要遍歷所有依賴的的文件(譯註:很多都是重複的間接依賴)。