自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 1.11 相比 Go 1.10 有哪些值得注意的改動?

開發(fā) 前端
Go 1.11 的 Go Modules 為 Go 生態(tài)帶來了現(xiàn)代化的依賴管理解決方案,雖然在當(dāng)時是初步引入,但它奠定了未來 Go 項目開發(fā)的基礎(chǔ),極大地改善了版本控制和構(gòu)建復(fù)現(xiàn)性。

https://go.dev/doc/go1.11

Go 1.11 值得關(guān)注的改動:

  1. WebAssembly 支持 : Go 1.11 實(shí)驗(yàn)性地增加了對 WebAssembly (js/wasm) 的支持,允許將 Go 程序編譯成可在瀏覽器中運(yùn)行的 .wasm 文件。編譯產(chǎn)物包含 Go 運(yùn)行時,因此體積較大(約 2MB,壓縮后 500KB),并提供了實(shí)驗(yàn)性的 syscall/js 包與 JavaScript 進(jìn)行交互。同時,新增了 GOOS="js" 和 GOARCH="wasm",命名符合 *_js.go 或 *_wasm.go 規(guī)則的文件現(xiàn)在僅在對應(yīng)編譯目標(biāo)下生效。
  2. Go 模塊 (Go Modules) : Go 1.11 初步引入了 Go 模塊 (Go Modules) 作為 GOPATH 的替代方案,提供了內(nèi)置的版本控制和包分發(fā)支持。雖然仍處于實(shí)驗(yàn)階段,但其目標(biāo)是讓開發(fā)者不再局限于 GOPATH 工作區(qū),并改善依賴管理和構(gòu)建的可復(fù)現(xiàn)性。
  3. 編譯器優(yōu)化 : 編譯器現(xiàn)在會報告在類型斷言 switch 語句的 guard 中聲明但未被使用的變量為錯誤,例如 switch x := v.(type) {} 中的 x 若未使用,編譯將失敗。這增強(qiáng)了代碼的嚴(yán)謹(jǐn)性,與 gccgo 和 go/types 的行為保持了一致。

下面是一些值得展開的討論:

Go 模塊 (Go Modules) 詳解

Go 1.11 版本引入了對 Go 模塊 (Go Modules) 的初步支持,這是 Go 語言在包管理和版本依賴方面的一個重大變革,旨在解決長期以來 GOPATH 模式帶來的諸多問題。Modules 提供了一種新的方式來管理項目依賴,集成了版本控制和包分發(fā)功能,使得開發(fā)者可以:

  • 在 GOPATH 之外創(chuàng)建和管理項目。
  • 通過 go.mod 文件明確、輕量地記錄項目的版本依賴信息。
  • 實(shí)現(xiàn)更可靠、更可復(fù)現(xiàn)的構(gòu)建過程。

盡管在 Go 1.11 中 Modules 仍處于實(shí)驗(yàn)階段,其細(xì)節(jié)可能會在后續(xù)版本中調(diào)整,但官方保證使用 Go 1.11 遷移到 Modules 的項目將在 Go 1.12 及以后版本中繼續(xù)工作。

Go 1.10 (及更早) 的 GOPATH 模式

在 Go 1.11 之前,Go 項目的開發(fā)和依賴管理主要依賴 GOPATH 環(huán)境變量。

  • 工作區(qū)限制 :所有的 Go 源代碼(包括你自己的項目和第三方依賴)都必須放在 $GOPATH/src 目錄下,形成了固定的目錄結(jié)構(gòu),例如 $GOPATH/src/github.com/user/project。
  • 依賴獲取 :使用 go get 命令下載依賴包,默認(rèn)會下載最新的代碼到 $GOPATH/src 對應(yīng)路徑下。
  • 版本管理缺失 :GOPATH 本身沒有內(nèi)置的版本控制機(jī)制。開發(fā)者通常需要借助第三方工具(如 dep, glide 等)或者手動將依賴復(fù)制到項目下的 vendor 目錄來進(jìn)行版本鎖定,但這并非語言內(nèi)置功能,且容易導(dǎo)致不一致。
  • 可復(fù)現(xiàn)性問題 :由于 go get 默認(rèn)拉取最新代碼,不同時間、不同環(huán)境下構(gòu)建同一個項目可能會因?yàn)橐蕾嚢姹镜淖兓a(chǎn)生不同的結(jié)果或構(gòu)建失敗。

Go 1.11 的 Go Modules 模式

Go Modules 的引入改變了這一切:

  • 項目位置自由 :項目可以放在文件系統(tǒng)中的任何位置,不再受 GOPATH 限制。
  • go.mod 文件 :每個模塊 (module) 的根目錄下都有一個 go.mod 文件。該文件定義了模塊路徑(module path)、項目所需的最低 Go 版本以及所有直接依賴項及其要求的最低版本(通過 require 指令)。
  • go.sum 文件 :伴隨 go.mod 生成的 go.sum 文件包含了模塊所依賴的包(包括直接和間接依賴)的具體版本及其內(nèi)容的哈希校驗(yàn)和,用于保證依賴包的完整性和構(gòu)建的可復(fù)現(xiàn)性。
  • 自動依賴管理 :當(dāng)你在代碼中 import 一個新的包,或者使用 go build, go test, go list 等命令時,Go 工具鏈會自動分析 go.mod 文件,下載缺失的依賴項到 $GOPATH/pkg/mod 目錄下(這是一個全局共享的緩存),并可能更新 go.mod 和 go.sum 文件。

示例對比

假設(shè)我們要創(chuàng)建一個簡單的項目,依賴 rsc.io/quote 包。

Go 1.10 (GOPATH 模式)

  • 確保你的項目在 $GOPATH/src 下,比如 $GOPATH/src/myproject。
  • 創(chuàng)建 main.go:
package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}
  • 獲取依賴:
go get rsc.io/quote

這會將 rsc.io/quote 的最新代碼下載到 $GOPATH/src/rsc.io/quote。沒有版本信息被記錄在你的項目里。

  • 構(gòu)建:
go build

Go 1.11 (Go Modules 模式)

  • 在任何你喜歡的位置創(chuàng)建項目目錄,比如 /path/to/myproject (無需在 GOPATH 內(nèi))。
  • 進(jìn)入目錄并初始化模塊:
cd /path/to/myproject
go mod init myproject

這會創(chuàng)建一個 go.mod 文件,內(nèi)容類似:

module myproject

go 1.11
  • 創(chuàng)建 main.go (內(nèi)容同上)。
  • 構(gòu)建或運(yùn)行:
go build
# 或者 go run .

Go 工具會自動檢測到 import "rsc.io/quote",查找該包的最新版本,下載它,并更新 go.mod 和 go.sum。

go.mod 文件可能變?yōu)椋?/p>

module myproject

go 1.11

require rsc.io/quote v1.5.2 // 版本號可能不同

go.sum 文件也會被創(chuàng)建,包含類似以下的校驗(yàn)和信息:

golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZO...
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:Nq...
rsc.io/quote v1.5.2 h1:w5fc...
rsc.io/quote v1.5.2/go.mod h1:Lz...
rsc.io/sampler v1.3.0 h1:7u...
rsc.io/sampler v1.3.0/go.mod h1:T1...

現(xiàn)在,項目的依賴及其精確版本都被清晰地記錄下來了。

GO111MODULE 環(huán)境變量

Go 1.11 使用 GO111MODULE 環(huán)境變量來控制模塊支持的開啟狀態(tài):

  • GO111MODULE=on: 強(qiáng)制使用模塊支持,忽略 GOPATH。
  • GO111MODULE=off: 強(qiáng)制禁用模塊支持,回歸 GOPATH 模式。
  • GO111MODULE=auto (默認(rèn)值): 當(dāng)項目在 $GOPATH/src 之外,并且根目錄或任何父目錄包含 go.mod 文件時,啟用模塊支持。否則,使用 GOPATH 模式。

其他相關(guān)變更

  • 導(dǎo)入路徑限制 : 由于 @ 符號在模塊相關(guān)的命令(如 go get example.com/pkg@v1.2.3)中有特殊含義,Go 1.11 開始禁止在 import 路徑中使用 @ 符號。
  • 包加載 API : 新增了 golang.org/x/tools/go/packages 包,提供了一個更強(qiáng)大的 API 來定位和加載 Go 源代碼包,它能更好地支持模塊,并可以與 Bazel、Buck 等其他構(gòu)建系統(tǒng)集成。這個包旨在未來替代標(biāo)準(zhǔn)庫中的 go/build 包。
  • 構(gòu)建緩存強(qiáng)制化 : Go 1.10 引入了構(gòu)建緩存 (GOCACHE)。Go 1.11 宣布這將是最后一個允許通過設(shè)置 GOCACHE=off 來禁用緩存的版本。從 Go 1.12 開始,構(gòu)建緩存將是強(qiáng)制性的,這是逐步淘汰 $GOPATH/pkg 的一步。模塊和新的包加載機(jī)制已經(jīng)依賴于啟用構(gòu)建緩存。

總而言之,Go 1.11 的 Go Modules 為 Go 生態(tài)帶來了現(xiàn)代化的依賴管理解決方案,雖然在當(dāng)時是初步引入,但它奠定了未來 Go 項目開發(fā)的基礎(chǔ),極大地改善了版本控制和構(gòu)建復(fù)現(xiàn)性。

責(zé)任編輯:武曉燕 來源: Piper蛋窩
相關(guān)推薦

2025-04-22 08:02:23

2025-04-21 00:05:00

2025-04-23 08:02:40

2025-04-21 00:00:00

Go 開發(fā)Go 語言Go 1.9

2025-04-14 00:00:04

2025-04-24 09:01:46

2025-04-27 08:00:35

2025-04-27 00:00:01

Go 1.16Go 1.15接口

2025-04-18 08:07:12

2025-04-14 08:06:04

2025-04-15 08:00:53

2025-04-17 08:00:48

2025-04-25 08:01:12

Go應(yīng)用程序部署

2025-04-28 08:00:56

2025-04-14 00:00:00

2025-04-11 08:02:38

2025-04-10 08:03:18

Go 1rune? 類型類型推斷

2010-07-12 10:48:21

SQL Server數(shù)

2023-08-14 08:34:14

GolangHttp

2010-07-21 16:28:33

職場
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號