1. gopath和goroot区别
GOPATH和GOROOT是Go语言的两个重要环境变量,它们的主要区别在于GOPATH是工作空间,而GOROOT是Go的安装目录。以下是详细介绍:
GOPATH。它是一个工作空间,用于存放Go项目的代码和第三方依赖包。在Go语言中,所有的包都保存在GOPATH的src目录下。当使用go get
下载包时,这些包会被下载到GOPATH的第一个路径下的src目录。当使用go install
命令时,会在GOPATH中找到的包的路径下生成可执行文件。124
GOROOT。它是指Go的安装目录,类似于其他编程语言的JDK目录。在GOROOT中,通常包含了Go的标准库代码,如bin
、doc
和src
目录。bin
目录中包含了Go的编译器和其他工具。
在使用Go语言时,通常需要设置这两个环境变量,以确保能够正确地编译和运行Go程序。
2. 无法下载github.com包
go get github.com/jmoiron/sqlx
fatal: unable to access 'https://github.com/jmoiron/sqlx/': Failed to connect to github.com port 443 after 75032 ms: Couldn't connect to server
package github.com/jmoiron/sqlx: exit status 128
解决方法:
添加代理:
PS: 具体可参考 https://github.com/goproxy/goproxy.cn
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
注意⚠️ 不要在storm Trminal里面执行,要在终端执行
3. go get命令下载下来的包放在哪里了
go get:当使用 go get 安装包时,它将包下载到 GOPATH 中的 pkg/mod 目录。在这个目录中,Go Modules 将下载和缓存所有的依赖项。如果你安装的是二进制工具,它们将被放在 GOPATH 的 bin 目录中。
例如,如果你的 GOPATH 是 /home/user/go,并且你运行 go get github.com/example/mypackage,包将被下载到 /home/user/go/pkg/mod 目录,而可执行文件(如果有的话)将被放在 /home/user/go/bin 目录。
4. Go Mod模式
Go Modules 在 Go 1.11 和 Go 1.12 中有三个模式,根据环境变量 GO111MODULE进行配置:
默认模式(未设置该环境变量或 GO111MODULE=auto)
Go 编译器在同时满足以下两个条件时使用 Go Mod
当前目录不在 GOPATH/src/ 下;
在当前目录或上层目录中存在 go.mod 文件;
GOPATH 模式(GO111MODULE=off)
Go 编译器从不使用 Go Mod。而会查找 vendor 目录和 GOPATH 以查找依赖项。
Go Modules 模式( GO111MODULE=on)
Go 编译器只使用 Go Mod,GOPATH不再作为导入目录,但它还是会把下载的依赖储存在 GOPATH/pkg/mod 中,也会把 go install 命令的结果放在 GOPATH/bin 中。
Go 1.13 及1.13以后版本默认使用 Go Mod 模式
在非$GOPATH目录的任意地方创建一个文件夹,然后再终端执行 go mod init project_name进行初始化操作,成功之后会发现目录下会生产一个go.mod文件
go mod tidy
最后在配置golang编辑器,就可以了。
5. string底层实现
在 Go 语言中,字符串类型的底层实现是一个字节数组,长度为字符串的长度。因为字符串是不可变的,所以当需要对字符串进行修改时,实际上是通过新建一个字符串来代替原来的字符串,而不是修改原来的字符串内容。
package main
import "fmt"
// 反转字符串函数
func reverseString(s string) string {
bytes := []rune(s)
for i, j := 0, len(bytes)-1; i < j; i, j = i+1, j-1 {
bytes[i], bytes[j] = bytes[j], bytes[i]
}
return string(bytes)
}
func main() {
str := "Hello, World!"
reversedStr := reverseString(str)
fmt.Println("原始字符串:", str)
fmt.Println("反转后的字符串:", reversedStr)
}