Goland丨报错汇总

报错汇总

1. 在运行go文件的时候报错:

1
./string.go:9:6: main redeclared in this block previous declaration at ./slice.go:5:6

后来找到问题为:同一个目录下面不能有个多 package main

因为在初学,所以换文件写例子的时候,不知道不能有两个package main,我的一个目录下有两个文件里面都写了main主程序;

  • 解决方案:把两个文件分开目录放;

2. 解决VSCode安装Go tools失败的问题

安装Go后,打开VS Code,按照提示安装了微软官方的GO插件。但在安装go tools时,出现了下面的一大堆错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
go.toolsGopath setting is not set. Using GOPATH /Users/l2m2/go
Installing 17 tools at /Users/l2m2/go/bin in module mode.
gocode
gopkgs
go-outline
go-symbols
guru
gorename
gotests
gomodifytags
impl
fillstruct
goplay
godoctor
dlv
gocode-gomod
godef
goimports
golint

Installing github.com/mdempsky/gocode FAILED
Installing github.com/uudashr/gopkgs/v2/cmd/gopkgs FAILED
Installing github.com/ramya-rao-a/go-outline FAILED
Installing github.com/acroca/go-symbols FAILED
Installing golang.org/x/tools/cmd/guru FAILED
Installing golang.org/x/tools/cmd/gorename FAILED
Installing github.com/cweill/gotests/... FAILED
Installing github.com/fatih/gomodifytags FAILED
Installing github.com/josharian/impl FAILED
Installing github.com/davidrjenni/reftools/cmd/fillstruct FAILED
Installing github.com/haya14busa/goplay/cmd/goplay FAILED
Installing github.com/godoctor/godoctor FAILED
Installing github.com/go-delve/delve/cmd/dlv FAILED
Installing github.com/stamblerre/gocode FAILED
Installing github.com/rogpeppe/godef FAILED
Installing golang.org/x/tools/cmd/goimports FAILED
Installing golang.org/x/lint/golint FAILED

17 tools failed to install.

gocode:
Error: Command failed: /usr/local/go/bin/go get -v github.com/mdempsky/gocode
go get github.com/mdempsky/gocode: module github.com/mdempsky/gocode: Get "https://proxy.golang.org/github.com/mdempsky/gocode/@v/list": dial tcp 172.217.160.113:443: i/o timeout
go get github.com/mdempsky/gocode: module github.com/mdempsky/gocode: Get "https://proxy.golang.org/github.com/mdempsky/gocode/@v/list": dial tcp 172.217.160.113:443: i/o timeout
  • 解决方案

设置代理

1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

go代理链接:https://goproxy.io/zh/

3. 解决go build报错cannot find main module; see ‘go help modules’

  • 描述
    在学习golang的过程中,执行go build和go test都会报下面的错误

    1
    go: cannot find main module; see ‘go help modules’
  • 解决方案
    由于之前设置过GO111MODULE=on,所以使用下面的命令解决

    1
    go mod init hello

生成了一个go.mod文件,然后再执行go build成功

  • 原因
    之前为了提高依赖包的下载速度,使用了goproxy
    然后开启的时候使用了以下命令
    1
    2
    go env -w GO111MODULE=on
    go env -w GOPROXY=https://goproxy.cn,direct

这使得go默认管理依赖的方式变成了go module模式,即依赖一个go.mod文件,其中描述了项目依赖的包和版本(类似于npm package.json,maven的pom.xml
而目录中没有go.mod文件,所以go不知道主模块是什么,所以无法编译

深入探究go语言在诞生之时,没有提供随之的包管理工具,而是使用go get来下载依赖包,并放在GOPATH/src下,并且没有使用版本控制,以为着每次都会拉取master分支的代码,软件包的代码放在src/github.com/xx/xx下面

而Go 1.11之后的版本引入了Go模块(Go Modules),Go Modules使用go.mod中标记的软件包的版本,软件包的代码放在pkg/mod下面

  • 使用Go Modules还是GOPATH
    go使用一个环境变量GO111MODULE来决定使用Go Modules还是GOPATH,该变量有三个值,并在不同版本下有不同的语义
1.11&1.12 1.13
GO111MODULE = on 不管在GOPATH 中还是外,都强制使用go.mod 不管在GOPATH 中还是外,都强制使用go.mod
GO111MODULE = off 强制 Go 表现出 GOPATH 方式,即使在 GOPATH 之外 强制 Go 表现出 GOPATH 方式,即使在 GOPATH 之外
GO111MODULE = auto 在GOPATH外时,GO111MODULE = on,在GOPATH内时,GO111MODULE = off 当有go.mod或者在GOPATH 之外,GO111MODULE = on,当处于 GOPATH 内且没有 go.mod 文件时,GO111MODULE = off