第 27 期 go mod 原始碼閱讀 part 2
文章來自於:https://reading.developerlearning.cn/reading/27-2019-01-10-go-mod-part-2/
分享者: 楊文
觀看視訊
Go 標準包閱讀
Go 版本:go 1.11.5
學到的內容
1. mf := new(modfile.File)
2. lineno++ 感覺是無用的程式碼?
dep.go 中 ParseGopkgLock 方法第 48 行有用到 lineno ,會列印出 strconv.Unquote 解析錯誤的檔名和行號
if len(val) >= 2 && val[0] == '"' && val[len(val)-1] == '"' {
q, err := strconv.Unquote(val) // Go unquoting, but close enough for now
if err != nil {
return nil, fmt.Errorf("%s:%d: invalid quoted string: %v", file, lineno, err)
}
val = q
}
其他幾個檔案可能是為了保持一致,或者為了將來輸出錯誤資訊特意保留的。其他檔案裡面的 lineno 沒有地方引用,大家在閱讀程式碼時會產生困惑,建議用空白符_來替代。
3. 判斷外部網路是否可用
if runtime.GOOS == "nacl" || runtime.GOOS == "js" {
t.Skipf("skipping test: no external network on %s", runtime.GOOS)
}
runtime.GOOS 返回程式所在的作業系統名
src\runtime\extern.go
// GOOS is the running program's operating system target:
// one of darwin, freebsd, linux, and so on.
const GOOS string = sys.GOOS
Native Client(NACL) 是一種允許在瀏覽器中執行 native compiled code 的技術,允許開發者運用自己熟悉的語言來開發 web 應用,而不只是 JavaScript,目前 NativeClient 技術只能應用於 google 自己的 chrome 中。 js 是指 Webassembly 技術,是在新版本 1.11 中才支援的,最新版本的瀏覽器可以支援。 NACL 和 JS 都不是真正的作業系統,不提供外部網路功能。
4.舊版模組管理配置轉換為 modfile
讀取當前目錄下舊版模組管理配置檔案,從 Converters 中根據配置檔名去獲取轉換方法。
src\cmd\go\internal\modconv\convert.go
// ConvertLegacyConfig converts legacy config to modfile.
// The file argument is slash-delimited.
func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error {
i := strings.LastIndex(file, "/")
j := -2
if i >= 0 {
j = strings.LastIndex(file[:i], "/")
}
convert := Converters[file[i+1:]]
if convert == nil && j != -2 {
convert = Converters[file[j+1:]]
}
if convert == nil {
return fmt.Errorf("unknown legacy config file %s", file)
}
mf, err := convert(file, data)
if err != nil {
return fmt.Errorf("parsing %s: %v", file, err)
}
...
}
src\cmd\go\internal\modconv\modconv.go
var Converters = map[string]func(string, []byte) (*modfile.File, error){
"GLOCKFILE": ParseGLOCKFILE,
"Godeps/Godeps.json": ParseGodepsJSON,
"Gopkg.lock": ParseGopkgLock,
"dependencies.tsv": ParseDependenciesTSV,
"glide.lock": ParseGlideLock,
"vendor.conf": ParseVendorConf,
"vendor.yml": ParseVendorYML,
"vendor/manifest": ParseVendorManifest,
"vendor/vendor.json": ParseVendorJSON,
}
目前 go 語言是使用 map 物件來儲存舊配置檔案和方法的對映關係這種設計思路的。@mai提出還有一種設計思路是抽象一個介面,各種配置管理來實現該介面。
參考
1.Google Native Client
2.NaCl and networking
3.Go 1.11 正式釋出 支援模組和 WebAssembly
4.WebAssembly 現狀與實戰
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 第 31 期 flag 包原始碼閱讀原始碼
- 第 35 期 context 原始碼閱讀Context原始碼
- go 中 select 原始碼閱讀Go原始碼
- 第 36 期 k8s context 實踐原始碼閱讀K8SContext原始碼
- 【原始碼閱讀】AndPermission原始碼閱讀原始碼
- go micro 原始碼閱讀-Options [Functional OGo原始碼Function
- Jaeger tchannel-go原始碼閱讀——PeerGo原始碼
- jbpm4.4原始碼閱讀(第8次)原始碼
- Jaeger tchannel-go —— readme原始碼閱讀Go原始碼
- basictracer-go原始碼閱讀二——SpanGo原始碼
- opentracing-go原始碼閱讀一Go原始碼
- Go 1.9 sync Map 原始碼閱讀筆記Go原始碼筆記
- basictracer-go原始碼閱讀——SpanRecorder與wireGo原始碼
- basictracer-go原始碼閱讀——examples(完結)Go原始碼
- koa原始碼閱讀[2]-koa-router原始碼
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- Go排程器系列(4)原始碼閱讀與探索Go原始碼
- 個人經驗分享如何閱讀Go語言原始碼Go原始碼
- opentracing-go原始碼閱讀——資訊攜帶Go原始碼
- basictracer-go原始碼閱讀——event&propagationGo原始碼
- Nacos2.X原始碼閱讀總結原始碼
- ReactorKit原始碼閱讀React原始碼
- AQS原始碼閱讀AQS原始碼
- CountDownLatch原始碼閱讀CountDownLatch原始碼
- HashMap 原始碼閱讀HashMap原始碼
- delta原始碼閱讀原始碼
- 原始碼閱讀-HashMap原始碼HashMap
- NGINX原始碼閱讀Nginx原始碼
- Mux 原始碼閱讀UX原始碼
- HashMap原始碼閱讀HashMap原始碼
- fuzz原始碼閱讀原始碼
- RunLoop 原始碼閱讀OOP原始碼
- express 原始碼閱讀Express原始碼
- muduo原始碼閱讀原始碼
- stack原始碼閱讀原始碼
- iOS開發原始碼閱讀篇--FMDB原始碼分析2(FMResultSet)iOS原始碼
- 【原始碼閱讀】Glide原始碼閱讀之load方法(二)原始碼IDE