https://haokan.baidu.com/v?pd=wisenatural&vid=6705549925823184427
rsyslogd 配置格式更新为新格式
你不知道的 Go 之 slice
golang 字符串截取
示例:
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 36 |
package main import ( "fmt" "unsafe" ) func main() { substr() } type String struct { str *byte length int } func (s *String) String() string { return fmt.Sprintf("str: %p\nlen: %d", s.str, s.length) } func inspectString(s *string) { a := (*String)(unsafe.Pointer(s)) fmt.Printf("%s\n", a.String()) } // 变量a的地址比变量b的地址大16字节,一方面体现了栈是向下走的,先分配a,在分配b // 另一方面,也体现了字符串变量占用的内存大小是16字节,一个指针和一个int // 变量b的str指针比变量a的str指针大2,说明b没有产生新的字符串内容 func substr() { a := "12345" b := a[2:4] println("a:", &a) inspectString(&a) println("b:", &b) inspectString(&b) } |
- 这里的字符串b复用了字符串a的一部分,使得
- 截取操作很快
- 字符串a离开作用域而字符串b没有离开作用域的话,a不能被gc
golang http-server 知识点
连接状态:
相关代码: src/net/http/server.go
状态说明:
New: 从Accept拿到一个新连接后,连接被标记为New,并触发hook
Active: 对于http2,只要连接上有请求存在,就算是Active的
Idle: 请求处理完毕,处于keep-alive状态
Hijack: 连接被偷走了,自己不需要继续处理了,这种连接不会进入Close状态的,Hijack 是个终态
Close:连接已关闭
参考:
关于测试
go语言开创性的让对测试的支持成为了语言本身的重要组成部分,足以说明go语言对测试的重视以及测试本身的重要性
儿子国旗下讲话 – 读书让我快乐
dolthub/dolt: Dolt – It’s Git for Data
https://github.com/dolthub/dolt
让MySQL表也能版本管理,这个对于存储配置的数据库非常不错。
通常使用git存储配置的好处是方便查看变更历史。然而,如何让生产服务器访问却不太方便。
所以,很多时候使用MySQL存储配置,但是,查看变更历史就不那么方便了。
现在,有了dolt,简直太棒了!
让tcpdump 不需要sudo
1 |
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump |
golang 之静态链接
golang程序如果build时不是static的话,Linux上基本会依赖glibc的动态库的,通常也不是啥问题,但是,如果你期望一个更高版本的glibc,但是目标机器上没有,就尴尬了,这时候,其实可以编译成一个静态链接的二进制程序的,这时候需要的就是编译环境上有glibc-static,centos上的安装方法为:
1 |
yum install glibc-static -y |
那么,静态链接和动态链接后的目标文件差别会非常大吗?
- 从目标文件大小上来看,应该会大一些,但是并不大的离谱:
123# ll -h ./build/manager*-rwxr-xr-x 1 junjie20 staff 24M Feb 20 11:42 ./build/manager-rwxr-xr-x 1 junjie20 staff 28M Feb 20 11:57 ./build/manager-static - 或许这个差值基本比较固定,你的程序越大,这个差值的占比就越小;但是,和你使用到的glibc中的代码的多少有关系
- 从执行的角度来看,动态链接是会启动更快一些,也比较节省内存,因为底层的动态库在内存中只需要加载一次;但是,如果我们的程序是跑在容器中的,而且,通常容器中只有一个进程,那么,扩容器共享底层动态库的可能性就很小,因为它能不是同一个文件(或许有技术可以做到这一点)。
- 编译的时候,静态链接会比动态链接要慢一点点,应该差别也不会太明显
- 所以,过时的静态链接可能真的又可以回来了
静态链接只需要添加选项:
1 |
--ldflags '--extldflags "-static -fpic"' |
注意:
- 静态链接不代表完全没有依赖,有些情况下对内核版本是有要求的