c c 碼農對go中包的錯誤理解

2021-08-04 06:51:47 字數 690 閱讀 1319

用現有的姿勢去解鎖新姿勢的過程中會有寫先入為主的錯誤,在解鎖新姿勢的過程中造成寫麻煩。

最為乙個自學go的c/c++碼農,在簡單掃過包這一概念時,直接把包理解成了.h檔案。忽略了包的本質。由於go的資料定義方式,導致我花了兩天時間也沒有找到相當於「」命名空間「或者」static的全域性變數「的功能,進而讓我的程式不僅全域性變數滿天飛,而且功能模組的封裝太差。直到需要單例的時候,差點放棄。最後發現這些是通過分包實現的。

.h檔案曾經因為暴露私有成員而廣受詬病。那麼,包是如何做到的呢?通過結構體的初始化方式可以窺知一二

type cat struct 

cat:=

npk.cat

c/c++是通過標頭檔案資訊,直接通過記憶體布局來初始化成員。但是go這裡我們可以看出來,是使用名字初始化成員。據我所學,實現這種方法的最直接方式就是反射。想到這裡也突然明白為什麼go要通過首字母大小寫來區分私有和公有。那麼如何實現包內的全域性資料保護問題的答案也浮出水面。

和c/c++是通過標頭檔案資訊,得到記憶體布局不同。go通過包內容的反射,對包外提供介面。這樣,包一來實現了命名空間的功能(包內內容包外無法直接訪問),二來實現了static全域性變數的功能(首字母小寫內容包外無法訪問)。所以即使程式是個人完成,為了解耦,乙個工程也要分割多個包。

這應該也是為什麼go的初始化方式五花八門了。new方法  new關鍵字 make的疑惑也解決了。

對C C 中字串的理解

c c 中每個字串都以字元 0作為結尾,以此作為字串結束的標誌。為了節省記憶體,c c 把常量字串放到單獨的乙個區域 一般放置在.rodata中 當幾個指標賦值給相同的常量字串時,它們實際上會指向相同的記憶體位址,因為在記憶體中,只存在乙份相同的常量字串。rodata區域一般用來放置唯讀資料,如常量...

python中對閉包的理解(1)

今天聊下python中閉包的用法,首先它是在函式內再定義乙個函式,內部定義的函式可以引用外部函式的引數和區域性變數,在呼叫外部函式時返回的是內部函式,但是不會立馬執行內部函式的程式體,需要單獨呼叫內部函式才會去執行。下面的程式就是閉包 首先正常定義乙個求和函式 def sum args s 0 fo...

關於C C 中,對static關鍵字的理解

準備知識 c c 的記憶體分布 對於乙個完整的程式,在記憶體中的分布情況如下 1.棧區 由編譯器自動分配釋放,像區域性變數,函式引數,都是在棧區。會隨著作用域退出而釋放空間。2.堆區 程式設計師分配並釋放的區域,像malloc c new c 3.全域性資料區 靜態區 內存在程式編譯的時候就已經分配...