1. go get命令

使用go自带的go get下载包的时候总是报错,仔细检查了下,其实是自己粗心使用仓库的格式不对

  1. 开头不能有https://
  2. 结尾不能有.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这个环境变量的作用:

  1. 存放sdk以外的第三方类库
  2. 自己收藏的可复用的代码

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 
}

5. 反射

https://studygolang.com/articles/20246

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐