你知道Golang源碼各目錄的作用嗎?

来源:https://www.cnblogs.com/pingyeaa/archive/2020/04/16/12715407.html
-Advertisement-
Play Games

我是平也,這有一個專註Gopher技術與成長的開源項目 "「go home」" 導讀 學習Go語言源碼的第一步就是瞭解先瞭解它的目錄結構,你對它的源碼目錄瞭解多少呢? 目錄總覽 AUTHORS:Golang官方作者清單 CONTRIBUTING.md:加入貢獻者隊列的指導文件 CONTRIBUTOR ...


我是平也,這有一個專註Gopher技術與成長的開源項目「go home」

導讀

學習Go語言源碼的第一步就是瞭解先瞭解它的目錄結構,你對它的源碼目錄瞭解多少呢?

目錄總覽

.
├── AUTHORS
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── LICENSE
├── PATENTS
├── README.boringcrypto.md
├── README.md
├── SECURITY.md
├── api
├── doc
├── favicon.ico
├── lib
├── misc
├── robots.txt
├── src
└── test

6 directories, 10 files
  • AUTHORS:Golang官方作者清單
  • CONTRIBUTING.md:加入貢獻者隊列的指導文件
  • CONTRIBUTORS:第三方貢獻者清單
  • LICENSE:授權協議
  • PATENTS:專利
  • README.boringcrypto.md:因為Golang是Google發佈的,這是針對Google內部研究分支的說明
  • README.md:說明文件,大家都明白,每個開源庫都有
  • SECURITY.md:安全政策
  • api:Golang每個版本的功能列表歸檔文件,下麵有具體介紹
  • doc:Golang文檔說明,和官方文檔相同,可以離線查看
  • favicon.ico:瀏覽器頁簽左邊的圖標,一般放在網站根目錄,就長這樣
    file
  • lib:看起來像是庫文檔模板,裡面列舉了time包的說明
  • misc:彙集了Go語言相關的IDE、插件、cgo測試程式、示例等亂七八糟的東西
  • robots.txt:主要用來控制各大搜索引擎爬蟲的爬取規則
  • src:Golang核心實現都在這裡,下麵詳細講述
  • test:Golang單元測試程式,通過查看測試程式可以學習到golang的用法和特性

目錄延伸

api

該目錄中的每個文件都是Go語言API列表,每行一個,方便IDE使用。

.
├── README
├── except.txt
├── go1.1.txt
├── go1.10.txt
├── go1.11.txt
├── go1.12.txt
├── go1.13.txt
├── go1.14.txt
├── go1.2.txt
├── go1.3.txt
├── go1.4.txt
├── go1.5.txt
├── go1.6.txt
├── go1.7.txt
├── go1.8.txt
├── go1.9.txt
├── go1.txt
└── next.txt

0 directories, 18 files
  • README:說明文件,裡面有對該目錄下文件作用的說明
  • except.txt:列舉了接下來可能會廢棄的API,但是並不影響相容問題
  • go*.txt:囊括了每個版本的API列表,文件內容只增不減,版本發佈後就歸檔不再改動
  • next.txt:列舉了未來的版本可能實現的新功能

src

archive

歸檔文件處理庫,可以用來處理tar與zip類型文件。

bufio

主要用於文本的讀取寫入,對io.Reader和io.Writer進行了實現和封裝,提供了比較便利的方法操作文件。

builtin

定義了常用了內置類型、函數和介面,比如make、new、len、error等。

bytes

定義了用來操作位元組的函數。

cmd

提供了Go語言的基本工具,比如我們常用的代碼格式化工具gofmt、靜態檢查工具vet等。

.
├── README.vendor
├── addr2line
├── api
├── asm
├── buildid
├── cgo
├── compile
├── cover
├── dist
├── doc
├── fix
├── go
├── go.mod
├── go.sum
├── gofmt
├── internal
├── link
├── nm
├── objdump
├── pack
├── pprof
├── test2json
├── trace
├── vendor
└── vet

22 directories, 3 files

下麵列舉出幾個比較常用的工具:

  • addr2line:因為linux上才支持這個命令,所以這裡做了一個模擬器,用來支持pprof的
  • objdump:跟addr2line作用一樣,這是linux中該命令的模擬實現,用來支持pprof
  • api:用於生成Go語言API列表,也就是上面提到的api目錄下的go*.txt文件
  • asm:彙編器,將源文件彙編為目標文件
  • buildid:用來更新庫或二進位文件中構建的標識
  • cgo:支持創建調用C代碼的包
  • compile:編譯工具
  • go:我們經常用的go命令,管理源代碼工具
  • godoc:用於提取並生成Go程式文檔
  • gofmt:代碼格式化工具
  • pack:備份壓縮工具,是unix系統中ar工具的簡單實現,它可以將多個文件打包為一個備存文件
  • link:連接器
  • vet:代碼靜態檢查工具
  • dist:是一個引導程式,負責構建Go語言的其他工具
  • fix:用來找到使用舊API的程式,然後更新為新的API
  • cover:用來分析單元測試覆蓋率的工具
  • inernal:一些內部通用實現,被其他包調用
  • nm:列出了由目標文件,歸檔文件或可執行文件定義或使用的符號
  • pprof:Go程式的性能分析工具
  • vendor:Go語言包依賴工具
  • test2json:將Go測試程式的輸出轉換為機器可讀的JSON流
  • trace:用來跟蹤分析goroutines運行調度狀態等功能的工具,比pprof更加細粒度

compress

壓縮、解壓工具,支持bzip2、flate、gzip、lzw、zlib等格式。

container

提供了雙向鏈表(list)、堆(heap)、環形聯表(ring)的數據結構的操作。

context

通常在goroutine切換執行時,需要知道相關狀態信息才能執行,而這些信息就被封裝在context中,它的使用在Go語言中十分廣泛。

crypto

封裝了很多加解密演算法,比如rsa、sha1、aes、md5等函數。

database

提供了各種資料庫的通用API,比如SQLite、MySQL、Postgres。

debug

支持Go程式調試。

encoding

封裝了各類編碼的實現,比如base64、json、xml、hex等。

.
├── ascii85
├── asn1
├── base32
├── base64
├── binary
├── csv
├── encoding.go
├── gob
├── hex
├── json
├── pem
└── xml

11 directories, 1 file

errors

是我們經常使用的錯誤函數,也可以自定義。

expvar

提供了一系列標準介面,可以通過HTTP的方式將伺服器的變數以JSON格式列印出來。

flag

解析處理命令行參數的工具。

fmt

封裝了各種格式化輸出方法。

go

hash

封裝了crc32、crc64在內的哈希函數。

html

HTML模板引擎,可以將代碼與HTML混合在一起,它會負責解析轉義,類似python的jinja、php的smarty等。

image

一般語言都會有的圖像處理庫。

index

用來實現字元串高速匹配查找。

internal

internal專門用來控制包導入許可權的,以internal命名的包只允許它父級和父級的子級目錄導入。

.
|-- checker
|   |-- internal
|   |   |-- cpu
|   |   |   `-- cpu.go
|   |   `-- ram
|   |       `-- ram.go
|   `-- server.go
|-- go.mod
|-- go.sum
`-- main.go

如上代碼,checker/internal/cpu和checker/internal/ram只能被checker包及其子包中的代碼導入,不能被main.go導入,否則會報錯。

io

為文件I/O提供了一些基本的介面,bufio就對它進行了實現。

log

封裝了日誌記錄方法,比如log.Fatal、log.Print等。

math

封裝了基本的數學相關的函數。

mime

封裝了MIME類型的解析,MIME是媒體類型,比如文檔、文件、位元組流性質的格式。

net

封裝了各種網路IO的函數,比如TCP、UDP、Socket等。

os

封裝了用來操作操作系統的命令,比如調用exec可以執行shell腳本等,當然它支持不同平臺的操作。

path

實現了用於處理斜杠分隔符路徑的函數。

plugin

Go1.8版本以後提供的插件機制,可以動態地載入動態鏈接庫文件.so,這樣對外發佈動態鏈接庫就不需要把源碼給到對方進行編譯了。

reflect

封裝反射讀取方法,比如讀取結構體的方法、屬性等。

regexp

封裝了正則表達式的實現。

runtime

包含了Go運行時的操作,這塊水很深,這裡目前不再展開陳述。

sort

封裝了部分排序演算法。

strconv

封裝了基礎類型與字元串互相轉換的方法,比如int轉string,反之亦然。

strings

封裝了字元串操作的相關方法。

sync

封裝了基本的同步機制,各種鎖的實現。

syscall

封裝了一系列系統調用的介面。

testing

為Go語言測試程式提供支持。

text

封裝了文本處理相關的方法,比如文本掃描或文本標簽過濾器等。

time

封裝了時間處理相關的函數,比如獲取當前時間,計算時間差等。

unicode

封裝了utf8、utf16的編解碼方法。

unsafe

用於一些不安全的操作場景,比如正常情況下,指向不同類型數據的指針是無法互相轉換的,但是就可以用unsafe的Pointer方法來實現,所以應該要謹慎使用。


感謝大家的觀看,如果覺得文章對你有所幫助,歡迎關註公眾號「平也」,聚焦Go語言與技術原理。
關註我


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 常常一些核心技術等我碰到的時候才發現自己忘得差不多了,甘心安於現狀,等自己跟別人有了差距之後才想起來要學習,我太難了,永遠不要停下自己學習的腳步,比你厲害的人真的有很多,今天給大家分享的是一份283頁的Java核心知識點(PDF)特別詳細,有幸得此寶典,這麼詳細的核心知識點怎能獨吞呢,分享給 ...
  • 上次分析了一下elastic4s的運算框架。本來計劃接著開始實質的函數調用示範,不過看過了Elastic4s的所有使用說明文檔後感覺還是走的快了一點。主要原因是elasticsearch在7.0後有了很多重點調整改變,elastic4s雖然一直在源代碼方面緊跟ES的變化,但使用文件卻一直未能更新,所 ...
  • 中小學生每個學期都要體檢,要量身高,因為身高可以反映孩子的生長狀況。現在,一個班的身高已經量好了,請輸出其中超過平均身高的那些身高。程式的輸入為一行數據,其中以空格分隔,每個數據都是一個正整數。程式要輸出那些超過輸入的正整數的平均數的輸入值,每個數後面有一個空格,輸出的順序和輸入的相同。 輸入格式: ...
  • Python 是最流行、功能最強大的編程語言之一。由於它是自由開源的,因此每個人都可以使用。大多數 Fedora 系統都已安裝了該語言。Python 可用於多種任務,其中包括處理逗號分隔值(CSV)數據。CSV文件一開始往往是以表格或電子錶格的形式出現。本文介紹瞭如何在 Python 3 中處理 C ...
  • 【目錄】 一、C/S 架構 和 B/S 架構 二、網路通信 三、互聯網通信協議——osi 七層協議(應表會傳網數物) 四、五層協議 五,小結 一、C/S 架構 和 B/S 架構 1、C/S 架構——Client/Server Client< >Server 客戶端軟體send 服務端軟體recv操作 ...
  • SpringMVC框架詳細教程-----導入SpringMVC必要的依賴包 ...
  • Laravel 團隊昨天發佈了 v7.5.0,其中包含了框架的一些更新的最新功能、修複和優化: 新的 Http 客戶端斷言 Christoph Rumpel 為 Http 客戶端提供了兩個新的測試方法: Http::assertNotSent(function ($request) { return ...
  • 我最近在 StackOverflow 上發現了很多詢問什麼是 Laravel Resource 控制器的問題。 本文解釋了這個基本概念,繼續往下看。 Laravel 資源型控制器 資源控制器就是 Laravel 控制器的一種,具有創建、讀取、更新和刪除資源(或模型)的所有方法。 您可以使用此 art ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...