1. go get命令
使用go自带的go get下载包的时候总是报错,仔细检查了下,其实是自己粗心使用仓库的格式不对
- 开头不能有https://
- 结尾不能有.git
正确写法:
go get github.com/easierway/concurrent_map
这里加 -u 可以强制从网上更新远程依赖
go get -u github.com/easierway/concurrent_map
2. 报错package xxx is not in GOROOT or GOPATH
原因:
Gopath这个环境变量的作用:
- 存放sdk以外的第三方类库
- 自己收藏的可复用的代码
go的默认找包方式是在Gopath找,它使用绝对路径提供项目的工作目录,在 GOPATH 指定的工作目录下,代码总是会保存在 $GOPATH/src 目录下
所以很麻烦
Go Modules 是 Go 语言的一种依赖管理方式
没有 GO111MODULE时, go编译程序的查找依赖的顺序 go path > goroot , 有了GO111MODULE后,会读取当前项目的 go.mod. 文件, 在go.mod文件中会记录有哪些依赖
分情况讨论:
GO111MODULE=“off”
解决方法:
go env -w GOPATH=~/project
# 这里设置为 ~/project是因为这个是我的项目文件
go的编译器会在 $GOPATH/src 下面寻找对应的模块,src下的每一个目录都可以对应一个模块,目录中的目录也可以是一个模块
GO111MODULE=“on”
在这种情况下,我们直接调用写好的模块会报错:
main.go:4:2: package module is not in GOROOT (/usr/local/go/src/module)
解决方法:
- 第一种方法:设置 GO111MODULE=“off” ,然后像上面的那种情况一样设置GOPATH
- 第二种方法:使用go mod,如下
在控制台输入
go mod init test
# test可以是任意的名称
然后我们引入模块的时候,以test(初始化时定义)开头,然后接模块路径,比如:
import "test/module"
如果使用这种方式Goland报错,但是可以进行正常编译,那么可以删除当前目录下的 .idea 目录然后重启项目即可
3. 切片的拷贝
切片与数组不同,是指针类型赋值,因此当我们想复制出两个值完全一样而互相赋值不影响的切片时,可以使用copy()方法,这样就只是进行了值的复制
package main
import "fmt"
func main() {
var a = []int{1, 2, 3}
// b := a 注意这里不能这样初始化b,不然a和b的地址又是一样的
b := make([]int, 3) //需要使用make方法重新开辟一段内存
// b = a 这里如果这样拷贝,b和a还是指向同一块内存空间
copy(b, a) //使用copy进行值的拷贝
fmt.Printf("%p \n", b)
fmt.Printf("%p \n", a)
b[2] = 6
fmt.Print(b, a)
}
运行结果:
4. 获取本机对外IP地址
func GetOutboundIP()(ip string, err error){
conn, err := net.Dial("udp","8.8.8.8:88")
if err != nil{
return
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
fmt.Println(localAddr.String())
ip = strings.Split(localAddr.IP.String(),":")[0]
return
}