ch13 review

This commit is contained in:
chai2010
2015-12-24 14:37:53 +08:00
parent 983524dbc8
commit 427ac25df9
7 changed files with 138 additions and 92 deletions

View File

@@ -1,21 +1,20 @@
# 第13章 底層編程
Go的設計包含了諸多安全策略, 限製了可能導致程序錯誤的用法. 編譯時類型檢査檢可以發現大多數類型不匹配的變量操作, 例如兩個字符串做減法的錯誤. 字符串, 字典, 切片 和管道等所有的內置類型, 都有嚴格的類型轉換規則.
Go語言的設計包含了諸多安全策略限製了可能導致程序運行齣現錯誤的用法編譯時類型檢査檢可以發現大多數類型不匹配的操作,例如兩個字符串做減法的錯誤字符串、map、slice和chan等所有的內置類型都有嚴格的類型轉換規則
對於無法靜態檢測到的錯誤, 例如數組訪問越界或使用空指針, 動態檢測可以保證程序在遇到問題的時候立卽終止併打印相關的錯誤信息. 自動內存管理(垃圾迴收)消除大部分野指針和內存洩漏的問題.
對於無法靜態檢測到的錯誤例如數組訪問越界或使用空指針,運行時動態檢測可以保證程序在遇到問題的時候立卽終止併打印相關的錯誤信息自動內存管理垃圾內存自動迴收)可以消除大部分野指針和內存洩漏相關的問題
Go的實現刻意隱藏了很多底層細節. 我們無法知道一個結構體的內存布局, 也無法穫取一個運行函數的機器碼, 也無法知道當前的 goroutine 是運行在哪個操作繫統線程上. 事實上, Go的調度器會自己決定是否需要將 goroutine 從一個操作繫統線程轉移到另一個操作繫統線程. 一個指向變量的指針也併沒有展示變量眞實的地址. 因爲垃圾迴收器會根據需要移動變量的位置, 當然對應的也會被自動更新.
Go語言的實現刻意隱藏了很多底層細節我們無法知道一個結構體眞實的內存布局也無法穫取一個運行函數對應的機器碼也無法知道當前的goroutine是運行在哪個操作繫統線程之上。事實上Go語言的調度器會自己決定是否需要將某個goroutine從一個操作繫統線程轉移到另一個操作繫統線程一個指向變量的指針也併沒有展示變量眞實的地址因爲垃圾迴收器可能會根據需要移動變量的內存位置,當然變量對應的地址也會被自動更新
總的來説, Go語言的這些特使得Go程序相比較低級的C語言來説, 更容易預測, 更容易理解, 也不容易崩潰. 通過隱藏底層的細節, 也使得Go程序具有高度的可移植性, 因爲語言的語義在很大程度上是獨立於任何編譯器, 操作繫統和CPU繫統結構的(當然也不完全絶對獨立: 例如CPU字的大小, 某些表達式求值的順序, 還有編譯器實現的一些限製).
總的來説Go語言的這些特使得Go程序相比較低級的C語言來説更容易預測和理解,程序也不容易崩潰通過隱藏底層的實現細節也使得Go語言編寫的程序具有高度的可移植性因爲語言的語義在很大程度上是獨立於任何編譯器實現、操作繫統和CPU繫統結構的當然也不完全絶對獨立例如int等類型就依賴於CPU機器字的大小某些表達式求值的具體順序,還有編譯器實現的一些額外的限製等)。
有時候我們可能會放棄部分語言特性而優先選擇更好的性能優化, 與其他語言編寫的庫互操作, 或者用純Go語言實現某些函數.
有時候我們可能會放棄使用部分語言特性而優先選擇更好具有更好性能的方法,例如需要與其他語言編寫的庫互操作或者用純Go語言無法實現某些函數
在本章, 我們將展示如何使用 unsafe 包來襬脫通常的規則限製, 如何創建C函數庫的綁定, 以及如何進行繫統調用.
在本章我們將展示如何使用unsafe包來襬脫Go語言規則帶來的限製講述如何創建C語言函數庫的綁定以及如何進行繫統調用
本章描述的方法不應該輕易使用. 如果沒有處理好細節, 它們可能導致各種不可預測的隱晦的錯誤, 甚至連本地的C程序員也無法理解. 使用 unsafe 包同時也無法保證與未來版本的兼容性, 因爲在有意無意中會使用很多實現的細節, 而這些實現的細節在未來很可能會改變.
本章提供的方法不應該輕易使用(譯註:屬於黑魔法,雖然可能功能很強大,但是也容易誤傷到自己)。如果沒有處理好細節它們可能導致各種不可預測的併且隱晦的錯誤甚至連有經驗的的C語言程序員也無法理解這些錯誤。使用unsafe包同時也放棄了Go語言保證與未來版本的兼容性的承諾,因爲它必然會在有意無意中會使用很多實現的細節而這些實現的細節在未來的Go語言中很可能會改變
unsafe 包的實現比較特殊. 雖然它可以和普通包一樣的導入和使用, 但它實際上是由編譯器實現的. 它提供了一些訪問語言內部特性的方法, 特别是內存布局相關的細節.
將這些特别封裝到一個獨立的包中, 是爲在極少數情況下需要使用的時候, 引起人們的註意(它們是不安全的). 此外, 有一些環境因爲安全的因素可能限製這個包的使用.
要註意的是unsafe包是一個采用特殊方式實現的包。雖然它可以和普通包一樣的導入和使用但它實際上是由編譯器實現的它提供了一些訪問語言內部特性的方法特别是內存布局相關的細節。將這些特性封裝到一個獨立的包中是爲在極少數情況下需要使用的時候同時引起人們的註意譯註因爲看包的名字就知道使用unsafe包是不安全的。此外有一些環境因爲安全的因素可能限製這個包的使用。
unsafe 包被廣泛地用於比較低級的包, 例如 runtime, os, syscall 還有 net 等, 因爲它們需要和操作繫統密切配合的, 但是普通的程序一般是不需要的.
不過unsafe包被廣泛地用於比較低級的包, 例如runtime、os、syscall還有net包等,因爲它們需要和操作繫統密切配合,但是對於普通的程序一般是不需要使用unsafe包的。