成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
Go 1.11 的 Go Modules 為 Go 生態帶來了現代化的依賴管理解決方案,雖然在當時是初步引入,但它奠定了未來 Go 項目開發的基礎,極大地改善了版本控制和構建復現性。

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

Go 1.11 值得關注的改動:

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

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

Go 模塊 (Go Modules) 詳解

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

  • 在 GOPATH 之外創建和管理項目。
  • 通過 go.mod 文件明確、輕量地記錄項目的版本依賴信息。
  • 實現更可靠、更可復現的構建過程。

盡管在 Go 1.11 中 Modules 仍處于實驗階段,其細節可能會在后續版本中調整,但官方保證使用 Go 1.11 遷移到 Modules 的項目將在 Go 1.12 及以后版本中繼續工作。

Go 1.10 (及更早) 的 GOPATH 模式

在 Go 1.11 之前,Go 項目的開發和依賴管理主要依賴 GOPATH 環境變量。

  • 工作區限制 :所有的 Go 源代碼(包括你自己的項目和第三方依賴)都必須放在 $GOPATH/src 目錄下,形成了固定的目錄結構,例如 $GOPATH/src/github.com/user/project。
  • 依賴獲取 :使用 go get 命令下載依賴包,默認會下載最新的代碼到 $GOPATH/src 對應路徑下。
  • 版本管理缺失 :GOPATH 本身沒有內置的版本控制機制。開發者通常需要借助第三方工具(如 dep, glide 等)或者手動將依賴復制到項目下的 vendor 目錄來進行版本鎖定,但這并非語言內置功能,且容易導致不一致。
  • 可復現性問題 :由于 go get 默認拉取最新代碼,不同時間、不同環境下構建同一個項目可能會因為依賴版本的變化而產生不同的結果或構建失敗。

Go 1.11 的 Go Modules 模式

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

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

示例對比

假設我們要創建一個簡單的項目,依賴 rsc.io/quote 包。

Go 1.10 (GOPATH 模式)

  • 確保你的項目在 $GOPATH/src 下,比如 $GOPATH/src/myproject。
  • 創建 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。沒有版本信息被記錄在你的項目里。

  • 構建:
go build

Go 1.11 (Go Modules 模式)

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

這會創建一個 go.mod 文件,內容類似:

module myproject

go 1.11
  • 創建 main.go (內容同上)。
  • 構建或運行:
go build
# 或者 go run .

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

go.mod 文件可能變為:

module myproject

go 1.11

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

go.sum 文件也會被創建,包含類似以下的校驗和信息:

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...

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

GO111MODULE 環境變量

Go 1.11 使用 GO111MODULE 環境變量來控制模塊支持的開啟狀態:

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

其他相關變更

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

總而言之,Go 1.11 的 Go Modules 為 Go 生態帶來了現代化的依賴管理解決方案,雖然在當時是初步引入,但它奠定了未來 Go 項目開發的基礎,極大地改善了版本控制和構建復現性。

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2025-04-22 08:02:23

2025-04-21 00:05:00

2025-04-17 08:00:48

2025-04-14 08:06:04

2025-04-25 08:01:12

Go應用程序部署

2025-04-15 08:00:53

2025-04-18 08:07:12

2025-04-28 08:00:56

2025-04-29 08:03:18

2025-05-06 05:00:00

2025-05-06 00:00:08

2025-05-06 08:00:35

2025-04-23 08:02:40

2025-04-24 09:01:46

2025-04-27 08:00:35

2025-04-21 00:00:00

Go 開發Go 語言Go 1.9

2025-04-30 09:02:46

2025-04-14 00:00:04

2025-04-27 00:00:01

Go 1.16Go 1.15接口

2025-04-11 08:02:38

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 香蕉久久av | 国产综合久久久久久鬼色 | 天天草夜夜骑 | 国产黄色麻豆视频 | 精品国产一区探花在线观看 | 一级黄色影片在线观看 | 久久久久久国模大尺度人体 | 国产精品一区二区三区四区 | 中文字幕1区2区3区 日韩在线视频免费观看 | 成人在线视频免费看 | 青青草综合 | 欧美日在线 | 久久天天躁狠狠躁夜夜躁2014 | 日韩不卡一区二区三区 | 精品www | 国产一区亚洲二区三区 | 久久久久国产一区二区三区 | 一级a爱片久久毛片 | 日韩一区中文字幕 | 亚洲一区二区视频 | 99久久久久 | 天天草天天操 | 欧美成人第一页 | 亚洲国产精品激情在线观看 | 亚洲欧美综合网 | 国产小u女发育末成年 | 午夜免费看| 日韩国产中文字幕 | 亚洲精品第一页 | 国产精品久久精品 | 亚洲一区二区三区久久久 | 一级毛片免费完整视频 | 一区二区三区av夏目彩春 | 亚洲欧美成人影院 | 久久精品免费观看 | 国产一区二区三区免费视频 | 97国产精品视频人人做人人爱 | 亚洲精品9999 | 一区二区三区国产在线观看 | 精品视频在线免费观看 | 欧美9999 |