golang踩坑日记

项目组织问题

写user项目的时候

1
yyp@yyp-virtual-machine:~/webscanner/service/user$ go mod init user

在整个目录下建立module

里面的结构如下:

1
2
3
4
5
6
7
yyp@yyp-virtual-machine:~/webscanner/service/user$ tree
.
├── config
│   └── config.go
├── go.mod
├── go.sum
└── user.go

user.go中定义的main方法,然后用了config.go里面的全局变量和方法

user.go的import要这样写:

1
import "user/config"

上面 go mod init user指定项目目录

然后import了config包,golang和c不同,包含其他包之后不是直接用原来包的变量名字,需要在前面加上包的名字,比如默认数据库配置 DefaultDB的map全局变量,在config里定义如下:

1
2
3
4
5
6
7
var DefaultDB = map[string]string{
"user": "yyp",
"passwd": "123456",
"address": "127.0.0.1",
"port": "3306",
"database": "finger",
}

在main中引用要这样:config.DefaultDB["user"]

类型转换问题

golang和python一样,可以通过.(String) 进行类型转换,但是今天在写一个函数的时候:

1
func which(Args map[string]interface{})

参数是一个map,然后在函数最前面取了两个参数:

1
2
url = Args["FlagUrl"].(string)
address = Args["FlagNetWork"].(string)

调试的时候报错了,原因是map变量Args的键值对 FlagNetWork的值为空,无法调用String方法

所以需要进行判空操作,再赋值,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var (
uri string
address string
)

if Args["FlagUrl"] != nil {
uri = Args["FlagUrl"].(string) //输入参数的url用uri表示,和查询的url作区分
} else {
uri = ""
}

if Args["FlagNetWork"] != nil {
address = Args["FlagNetWork"].(string)
} else {
address = ""
}

网络编程问题

建立连接,使用函数 net.DialTimeout() 时,返回两个值,Conn,err 其中 Conn 如果是nil,不能直接进行其他操作,比如Close() 不然会报错喵

结构体定义问题

golang要求所有结构体成员变量的首字母需要大写,如果首字母小写的话,则该字段无法被外部包访问和解析

今天在用encoding/json包解析json的时候,用的小写的结构体成员,然后返回的是空的json集合,原因就是json是外部包,不大写的话不行喵