Go 使用过程中遇到的问题📝

介绍

在日常的开发过程中,主要使用的语言就是 Go。记录下使用过程中遇到的一些问题以及踩到的的坑。

Json 序列化,Tag

在 Go 中如果需要进行 Json 的序列化,常用到的方法有 json.Marshal

1
func Marshal(v interface{}) ([]byte, error)

对需要序列化的结构体进行操作。

1
2
3
4
5
6
7
8
9
type Message struct {
Name string
Body string
Time int64
}

m := Message{"Alice", "Hello", 1294706395881547000}
b, err := json.Marshal(m) // 一切正常,err == nil。
b == []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)

如果需要对生成 json 的字段进行指定,那么需要使用 tag,同时需要注意tag使用时的规范。

1
2
3
4
5
6
7
8
9
10
11
type Message struct {
Name string `json:"name"` // 正确使用 tag
Body string `json:body` // 没有加双引号
Time int64 // 不使用 tag
}

m := Message{"Alice", "Hello", 1294706395881547000}
b, err := json.Marshal(m) // 一切正常,err == nil。

// 只有 name 字段的字段名发生了改变
b == []byte(`{"name":"Alice","Body":"Hello","Time":1294706395881547000}`)

因此在使用过程中发现生成的字段名称不符合预期时,可以检查对应的 tag。

Json 反序列化

与序列化时相同,在对需要反序列化的 byte slice 调用 json.Unmarshal.

1
func Unmarshal(data []byte, v interface{}) error

使用时需要先声明一个变量用于存放反序列化后生成的对象。

1
var m Message

然后需要调用 json.Unmarshal,传入json 数据的 byte slice, 以及指向 m 的指针

1
err := json.Unmarshal(b, &m)

⚠️特别注意的是:如果在调用时没有传入指针,而是直接传入了 m, 那么将序列化失败,m 中将不包含任何信息。

在对某个 json 反序列化之后发现没有获取到任何的数据,debug 时可以注意,是否在编码时出现typo,没有使用指针,而是直接传入了 m。

同时在反序列化的过程中,会按照以下的以下的顺序查找对应的字段:

  • 是否是标签中声明的字段名
  • 是否是结构体定义的字段名
  • 是否是结构体定义的字段名的大小写变化后的名字,如”Foo”对应的”FOO”, “FoO”.

如果都没有符合条件的选项,那么 Unmarshal 方法将会忽略这个字段,不对他进行处理。

使用GOPROXY

在国内使用 go get 命令获取依赖包时,由于🧱🧱的原因,导致无法安装某些依赖。比如 golang.org/x/net 包。为了解决这个问题,可以通过下载 github 上的源码,并将其放在 $GOPATH/src/golang.org/x 目录下,手动编译来解决。

除了手动下载编译外,还可以通过使用代理来进行下载。推荐使用 goproxy, goproxy 是七牛云搭建的代理服务,可以快速下载所需要的第三方依赖。

使用方法:

  • Go 1.3 及以上版本(推荐)

    执行下面的命令

    1
    $ go env -w GOPROXY=https://goproxy.cn,direct

    其他版本可以通过设置环境变量 GOPROXY 来实现:

  • linux 以及 macOS

在 terminal 下执行

1
$ export GOPROXY=https://goproxy.cn

或者是

1
$ echo "export GOPROXY=https://goproxy.cn" >> ~/.profile && source ~/.profile
  • Windows

    打开 powershell, 执行:

    1
    C:\> $env:GOPROXY = "https://goproxy.cn"

Go 使用过程中遇到的问题📝
https://blog.zhangliangliang.cc/post/some-problems.html
作者
Bobby Zhang
发布于
2019年9月20日
许可协议