[TOC]
# 問題描述
當我們使用`go get`、`go install`、`go mod`等命令時,會自動下載相應的包或依賴包。但由于眾所周知的原因,類似于`golang.org/x/...`的包會出現下載失敗的情況。如下所示:
~~~
go get -u golang.org/x/sys
go get golang.org/x/sys: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
~~~
# 手動下載
我們常見的`golang.org/x/...`包,一般在 GitHub 上都有官方的鏡像倉庫對應。比如`golang.org/x/text`對應`github.com/golang/text`。所以,我們可以手動下載或 clone 對應的 GitHub 倉庫到指定的目錄下
~~~
mkdir $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone git@github.com:golang/text.git
rm -rf text/.git
~~~
當如果需要指定版本的時候,該方法就無解了,因為 GitHub 上的鏡像倉庫多數都沒有 tag。并且,手動嘛,程序員怎么能干呢,尤其是依賴的依賴,太多了
# 設置代理
如果你**有代理**,那么可以設置對應的環境變量
~~~
export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port
~~~
或者,直接用`all_proxy`
~~~
export all_proxy=http://proxyAddress:port
~~~
# `go mod replace`
從 Go 1.11 版本開始,新增支持了`go modules`用于解決包依賴管理問題。該工具提供了`replace`,就是為了解決包的別名問題,也能替我們解決`golang.org/x`無法下載的的問題。
`go module`被集成到原生的`go mod`命令中,但是如果你的代碼庫在`$GOPATH`中,`module`功能是默認不會開啟的,想要開啟也非常簡單,通過一個環境變量即可開啟`export GO111MODULE=on`
~~~
module example.com/hello
require (
golang.org/x/text v0.3.0
)
replace (
golang.org/x/text => github.com/golang/text v0.3.0
)
~~~
類似的還有[glide](https://github.com/Masterminds/glide)、[gopm](https://github.com/gpmgo/gopm)等這類第三方包管理工具,都不同方式的解決方案提供給我們。
# GOPROXY 環境變量
終于到了本文的終極大殺器 ——**GOPROXY**。
我們知道從`Go 1.11`版本開始,官方支持了`go module`包依賴管理工具。
其實還新增了`GOPROXY`環境變量。如果設置了該變量,下載源代碼時將會通過這個環境變量設置的代理地址,而不再是以前的直接從代碼庫下載。這無疑對我等無法科學上網的開發良民來說是最大的福音。
更可喜的是,[goproxy.io](https://github.com/goproxyio/goproxy)這個開源項目幫我們實現好了我們想要的。該項目允許開發者一鍵構建自己的`GOPROXY`代理服務。同時,也提供了公用的代理服務`https://goproxy.io`,我們只需設置該環境變量即可正常下載被墻的源碼包了:
~~~
export GOPROXY=https://goproxy.io
~~~
不過,**需要依賴于`go module`功能**。可通過`export GO111MODULE=on`開啟 MODULE。
如果項目不在`GOPATH`中,則無法使用`go get ...`,但可以使用`go mod ...`相關命令。
也可以通過置空這個環境變量來關閉,`export GOPROXY=`。
對于 Windows 用戶,可以在`PowerShell`中設置:
~~~
$env:GOPROXY = "https://goproxy.io"
~~~
最后,我們當然推薦使用`GOPROXY`這個環境變量的解決方式,前提是**Go version >= 1.11**。
- 基礎
- 簡介
- 主要特征
- 變量和常量
- 編碼轉換
- 數組
- byte與rune
- big
- sort接口
- 和mysql類型對應
- 函數
- 閉包
- 工作區
- 復合類型
- 指針
- 切片
- map
- 結構體
- sync.Map
- 隨機數
- 面向對象
- 匿名組合
- 方法
- 接口
- 權限
- 類型查詢
- 異常處理
- error
- panic
- recover
- 自定義錯誤
- 字符串處理
- 正則表達式
- json
- 文件操作
- os
- 文件讀寫
- 目錄
- bufio
- ioutil
- gob
- 棧幀的內存布局
- shell
- 時間處理
- time詳情
- time使用
- new和make的區別
- container
- list
- heap
- ring
- 測試
- 單元測試
- Mock依賴
- delve
- 命令
- TestMain
- path和filepath包
- log日志
- 反射
- 詳解
- plugin包
- 信號
- goto
- 協程
- 簡介
- 創建
- 協程退出
- runtime
- channel
- select
- 死鎖
- 互斥鎖
- 讀寫鎖
- 條件變量
- 嵌套
- 計算單個協程占用內存
- 執行規則
- 原子操作
- WaitGroup
- 定時器
- 對象池
- sync.once
- 網絡編程
- 分層模型
- socket
- tcp
- udp
- 服務端
- 客戶端
- 并發服務器
- Http
- 簡介
- http服務器
- http客戶端
- 爬蟲
- 平滑重啟
- context
- httptest
- 優雅中止
- web服務平滑重啟
- beego
- 安裝
- 路由器
- orm
- 單表增刪改查
- 多級表
- orm使用
- 高級查詢
- 關系查詢
- SQL查詢
- 元數據二次定義
- 控制器
- 參數解析
- 過濾器
- 數據輸出
- 表單數據驗證
- 錯誤處理
- 日志
- 模塊
- cache
- task
- 調試模塊
- config
- 部署
- 一些包
- gjson
- goredis
- collection
- sjson
- redigo
- aliyunoss
- 密碼
- 對稱加密
- 非對稱加密
- 單向散列函數
- 消息認證
- 數字簽名
- mysql優化
- 常見錯誤
- go run的錯誤
- 新手常見錯誤
- 中級錯誤
- 高級錯誤
- 常用工具
- 協程-泄露
- go env
- gometalinter代碼檢查
- go build
- go clean
- go test
- 包管理器
- go mod
- gopm
- go fmt
- pprof
- 提高編譯
- go get
- 代理
- 其他的知識
- go內存對齊
- 細節總結
- nginx路由匹配
- 一些博客
- redis為什么快
- cpu高速緩存
- 常用命令
- Go 永久阻塞的方法
- 常用技巧
- 密碼加密解密
- for 循環迭代變量
- 備注
- 垃圾回收
- 協程和纖程
- tar-gz
- 紅包算法
- 解決golang.org/x 下載失敗
- 逃逸分析
- docker
- 鏡像
- 容器
- 數據卷
- 網絡管理
- 網絡模式
- dockerfile
- docker-composer
- 微服務
- protoBuf
- GRPC
- tls
- consul
- micro
- crontab
- shell調用
- gorhill/cronexpr
- raft
- go操作etcd
- mongodb