W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
原文鏈接:https://gopl-zh.github.io/ch13/ch13.html
Go語言的設(shè)計(jì)包含了諸多安全策略,限制了可能導(dǎo)致程序運(yùn)行出錯(cuò)的用法。編譯時(shí)類型檢查可以發(fā)現(xiàn)大多數(shù)類型不匹配的操作,例如兩個(gè)字符串做減法的錯(cuò)誤。字符串、map、slice和chan等所有的內(nèi)置類型,都有嚴(yán)格的類型轉(zhuǎn)換規(guī)則。
對(duì)于無法靜態(tài)檢測(cè)到的錯(cuò)誤,例如數(shù)組訪問越界或使用空指針,運(yùn)行時(shí)動(dòng)態(tài)檢測(cè)可以保證程序在遇到問題的時(shí)候立即終止并打印相關(guān)的錯(cuò)誤信息。自動(dòng)內(nèi)存管理(垃圾內(nèi)存自動(dòng)回收)可以消除大部分野指針和內(nèi)存泄漏相關(guān)的問題。
Go語言的實(shí)現(xiàn)刻意隱藏了很多底層細(xì)節(jié)。我們無法知道一個(gè)結(jié)構(gòu)體真實(shí)的內(nèi)存布局,也無法獲取一個(gè)運(yùn)行時(shí)函數(shù)對(duì)應(yīng)的機(jī)器碼,也無法知道當(dāng)前的goroutine是運(yùn)行在哪個(gè)操作系統(tǒng)線程之上。事實(shí)上,Go語言的調(diào)度器會(huì)自己決定是否需要將某個(gè)goroutine從一個(gè)操作系統(tǒng)線程轉(zhuǎn)移到另一個(gè)操作系統(tǒng)線程。一個(gè)指向變量的指針也并沒有展示變量真實(shí)的地址。因?yàn)槔厥掌骺赡軙?huì)根據(jù)需要移動(dòng)變量的內(nèi)存位置,當(dāng)然變量對(duì)應(yīng)的地址也會(huì)被自動(dòng)更新。
總的來說,Go語言的這些特性使得Go程序相比較低級(jí)的C語言來說更容易預(yù)測(cè)和理解,程序也不容易崩潰。通過隱藏底層的實(shí)現(xiàn)細(xì)節(jié),也使得Go語言編寫的程序具有高度的可移植性,因?yàn)檎Z言的語義在很大程度上是獨(dú)立于任何編譯器實(shí)現(xiàn)、操作系統(tǒng)和CPU系統(tǒng)結(jié)構(gòu)的(當(dāng)然也不是完全絕對(duì)獨(dú)立:例如int等類型就依賴于CPU機(jī)器字的大小,某些表達(dá)式求值的具體順序,還有編譯器實(shí)現(xiàn)的一些額外的限制等)。
有時(shí)候我們可能會(huì)放棄使用部分語言特性而優(yōu)先選擇具有更好性能的方法,例如需要與其他語言編寫的庫進(jìn)行互操作,或者用純Go語言無法實(shí)現(xiàn)的某些函數(shù)。
在本章,我們將展示如何使用unsafe包來擺脫Go語言規(guī)則帶來的限制,講述如何創(chuàng)建C語言函數(shù)庫的綁定,以及如何進(jìn)行系統(tǒng)調(diào)用。
本章提供的方法不應(yīng)該輕易使用(譯注:屬于黑魔法,雖然功能很強(qiáng)大,但是也容易誤傷到自己)。如果沒有處理好細(xì)節(jié),它們可能導(dǎo)致各種不可預(yù)測(cè)的并且隱晦的錯(cuò)誤,甚至連有經(jīng)驗(yàn)的C語言程序員也無法理解這些錯(cuò)誤。使用unsafe包的同時(shí)也放棄了Go語言保證與未來版本的兼容性的承諾,因?yàn)樗厝粫?huì)有意無意中使用很多非公開的實(shí)現(xiàn)細(xì)節(jié),而這些實(shí)現(xiàn)的細(xì)節(jié)在未來的Go語言中很可能會(huì)被改變。
要注意的是,unsafe包是一個(gè)采用特殊方式實(shí)現(xiàn)的包。雖然它可以和普通包一樣的導(dǎo)入和使用,但它實(shí)際上是由編譯器實(shí)現(xiàn)的。它提供了一些訪問語言內(nèi)部特性的方法,特別是內(nèi)存布局相關(guān)的細(xì)節(jié)。將這些特性封裝到一個(gè)獨(dú)立的包中,是為在極少數(shù)情況下需要使用的時(shí)候,同時(shí)引起人們的注意(譯注:因?yàn)榭窗拿志椭朗褂胾nsafe包是不安全的)。此外,有一些環(huán)境因?yàn)榘踩囊蛩乜赡芟拗七@個(gè)包的使用。
不過unsafe包被廣泛地用于比較低級(jí)的包,例如runtime、os、syscall還有net包等,因?yàn)樗鼈冃枰筒僮飨到y(tǒng)密切配合,但是對(duì)于普通的程序一般是不需要使用unsafe包的。
![]() | ![]() |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: