1、go build卡住不动
设置代理,在终端运行:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
2、golang安装:
https://blog.csdn.net/qq_44830881/article/details/123457805
3、dlv安装
https://zhuanlan.zhihu.com/p/425645473
https://www.jianshu.com/p/7373042bba83
使用go install安装dlv后,运行dlv报错:
bash: dlv: command not found
解决方案:添加环境变量
export PATH=$GOPATH/bin:$PATH # 当$GOPATH为空时,填入具体的GOPATH路径
4、使用dlv exec 调试可执行文件,格式如下:
dlv exec <可执行文件名> -- <命令行参数flags> # 在命令行参数flags前加入--
dlv 中打印字符串不全:
(dlv) config max-string-len 99999
(dlv) config -list
aliases map[]
substitute-path []
max-string-len 9999
max-array-values <not defined>
show-location-expr false
(dlv) print string_var
5、如果 $GOBIN不为空,go install 会把可执行程序安装到$GOBIN目录下,否则把可执行程序安装到$GOPATH/bin目录下。
下面设置$GOBIN是错误的,其值是一个目录GOROOT/bin:GOPATH/bin,而不是目录GOPATH/bin或者GOROOT/bin
export GOBIN="GOROOT/bin:GOPATH/bin"
6、go version 版本不对
配置以下环境变量
export GOROOT=设置成GO的安装目录
export GOPATH=设置成特定目录
export PATH="$GOPATH/bin:$GOROOT/bin:$PATH" #PATH查找可执行文件的顺序是从左到右,所以会先从设置的$GOROOT中找到go
7、在以下 go结构体 和 json数据映射。
当结构体中字段多时,多出的字段值为nil或者零值。
当json数据中字段多时,解析json时会忽略。
go结构体:
type Req struct {
Certificate *CertificateInput `json:"certificate"`
}
type CertificateInput struct {
Id int64 `json:"id"`
}
json数据:
{
"certificate": {
"id": 30
}
}
- 如果json数据中没有certificate字段,
json数据中没有certificate字段
{
}
则Req.Certificate为nil。
- 如果json数据中certificate字段为空白,即
json数据:
{
"certificate": {
}
}
则Req.Certificate不为nil,但是Req.Certificate中字段值为0,即Req.Certificate.Id 为0
- 如果json数据中有比结构体中多的字段,不会报错,在解析json数据时会忽略结构体中不存在的字段。例如
json数据
{
"certificate": {
"id": 30
}
"a" : "b"
}
该json数据仍然能被正确解析。
- 结构体中字段的顺序不需要和json数据中的字段顺序相同。JSON 解析时会根据字段名来匹配对应的字段,而不依赖于顺序。
8、
在go中,用range遍历列表s时, 每次局部变量v的地址相同,要想引用s中的元素,要用&s[i]
for i, v := range s
9、
在go中,访问map中不存在的key,会返回该value类型的零值。例如:
strMap := make(map[string]string)
val, existed := strMap["test"] // val为"", existed 为false
10、一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。例如, bytes.Buffer实现了io.Writer接口,即bytes.Buffer实现了方法
Write(p []byte) (n int, err error)
则
var w io.Writer
w = new(bytes.Buffer) // OK: *bytes.Buffer has Write method
11、接口值由动态类型type和动态值value两部分构成,其零值为nil,即动态类型type和动态值value都为nil
var w io.Writer
则w = nil
使用类型断言来获取 interface 的动态值,例如
var i interface{} = "hello"
s, ok := i.(string) // 类型断言
if ok {
fmt.Println(s)
} else {
fmt.Println("i is not a string")
}
interface{} 是空接口类型,没有任何方法,对实现它的类型没有要求,所以我们可以将任意一个值赋给空接口类型。用类型断言来获取interface{}中值。