这里会记录一些平时遇到的问题和解决办法,方便自己以后的查询

VSCode

Golang

vscode golang 插件

在安装完推荐的所有插件之后,就会默认开启保存格式化插件,未使用的包会自动删除代码。这时候,将 Preference 中的 Go: Format Tool 从默认的 goreturns 修改为 gofmt 就可以了。

Go 踩坑记录

slice 陷阱

在声明 slcie 之后,如果带了 len,就会初始化为默认值,所以如果只是想作为初始值声明,那么需要将 len 放在 cap 的位置,或者直接声明 0, 或者 var

打印优美格式的 json

1
json.MarshalIndent(data, "", "    ")

json 编码问题

golang 默认是使用 utf-8 进行编码的,所以如果使用 GBK 编码,json.Marshal 与 UnMarshal 是无法保证双向可转换的,需要自己实现 Marshal 对应的接口,做一层 Wrapper 封装。

检查代码单测覆盖率

在写单测时候,可以使用可视化方式来检查新的逻辑是否覆盖

1
2
3
4
5
6
# 生成测试覆盖率文件
go test -coverprofile=coverage.out
# 命令行展示覆盖率
go tool cover -func=coverage.out
# 使用html 来进行展示单元测试覆盖率
go tool cover -html=coverage.out

rand 库使用

rand 中有两个 Source,直接创建的 rand.NewSourc 是线程不安全的,如果想使用线程安全的 rand,可以直接使用全局的 rand,因为默认会提供带 mutex 的 Source(var globalRand = New(&lockedSource{src: NewSource(1).(*rngSource)})),这样可以做到线程安全的随机。

值拷贝

go 中的一切赋值本质上都是值拷贝

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
type Conf struct {
    A string
}

type Service struct {
    Conf
}

func change(c *Conf) {
    c.A = "b"
}

func main() {
    conf := Conf{"a"}
    service := Service{
        Conf: conf,
    }
    change(&conf)
    fmt.Println(service.Conf.A)  // a
}

在嵌套的 struct 中的赋值,并不是直接将这个值赋给 Service,而是创建了一个 struct,将值拷贝给它

多值排序

可以使用 sort 包进行排序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
type Item []int
type Items []Item

func (i Items) Len() int {
    return len(i)
}

func (is Items) Swap(i, j int) {
    is[i], is[j] = is[j], is[i]
}

func (is Items) Less(i, j int) bool {
    if is[i][0] < is[j][0] {
        return true
    }
    if is[i][0] > is[j][0] {
        return false
    }
    return is[i][1] < is[j][1]
}

mysql

安装完 mysql 需要更改编码为 utf-8

1
 ALTER DATABASE sp CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Linux

apt 添加 socks5 代理

如果有国外的源导致无法下载,可以使用 apt 添加 socks5 代理。

1
sudo vim /etc/apt/apt.conf.d/proxy.conf
1
2
Acquire::http::Proxy "http://127.0.0.1:1080";
Acquire::https::Proxy "http://127.0.0.1:1080";

时间同步

通过向 Google 服务器请求当前时间并裁剪出需要的形式,并根据结果进行时间的设定。

1
date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

查看进程相关

查看占用某端口的进程

1
2
lsof -i:<port>
netstat -tunlp | grep <port>

查看某进程打开的句柄

1
lsof -np <pid>

Ubuntu 中文字体显示问题

在 Ubuntu 中,中文个人字体显示不完全,例如“复”字显示只有一半。 在/etc/fonts/conf.avail/64-language-selector-prefer.conf 中可以发现,SC 在 JP 渲染之后,所以将其顺序调整,重启或 log out 登录后生效。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <alias>
            <family>sans-serif</family>
            <prefer>
                    <family>Noto Sans CJK SC</family>
                    <family>Noto Sans CJK TC</family>
                    <family>Noto Sans CJK HK</family>
                    <family>Noto Sans CJK JP</family>
                    <family>Noto Sans CJK KR</family>
                    <family>Lohit Devanagari</family>
            </prefer>
    </alias>
    <alias>
            <family>serif</family>
            <prefer>
                    <family>Noto Serif CJK SC</family>
                    <family>Noto Serif CJK TC</family>
                    <family>Noto Serif CJK JP</family>
                    <family>Noto Serif CJK KR</family>
                    <family>Lohit Devanagari</family>
            </prefer>
    </alias>
    <alias>
            <family>monospace</family>
            <prefer>
                    <family>Noto Sans Mono CJK SC</family>
                    <family>Noto Sans Mono CJK TC</family>
                    <family>Noto Sans Mono CJK HK</family>
                    <family>Noto Sans Mono CJK JP</family>
                    <family>Noto Sans Mono CJK KR</family>
            </prefer>
    </alias>
</fontconfig>

多行 bash

使用control+x+e 可以进入 vim 模式,进行多行编辑

GNOME 分屏插件

gTile

git

格式化输出

git 较为直观地输出 log

1
git log --graph --pretty=oneline --abbrev-commit

代理

1
2
git config --global http.proxy socks5://127.0.0.1:1080  # 这里需要根据自己本地开放端口的不同进行设置
git config --global --unset http.proxy

删除分支

极其危险!!!

1
git branch -d xxx

回滚单个文件

1
git checkout xxxhash xxxFile

vim

跳转到最后一行 shift+g 跳转到最后一个字符 shift+4 vim 直接 copy 是不会拷贝\t这样的特殊字符的,都会被转换成空格,所以对于数据有精确要求需要用别的方法拷贝,例如 cat 或 less

HTTP

返回合法 header

如果允许用户设置自定义的 header,需要检查 header 的长度大小,因为对于 nginx,在提前为 header 分配空间的时候,由配置项控制,不能允许过大的 header;如果用户设置中包含了\x00这样的特殊控制字符,需要提前将其进行转义或者替换,否则 nginx 返回的时候,会直接被截断,返回 502。

重试操作

对于服务端状态码进行区分的重试操作,502 和 504 可以在失败后进行重试,500 这样服务端出错的,可以不考虑重试。

macOS

平台不兼容

macOS 原版 cp 的时候会把软链接直接复制成真实文件夹,在拷贝的时候会踩坑