ALOVN

志当存高远

Go语言之内存堆栈分配(逃逸分析)

Stack and Heep Memory in golang

栈 Go程序在运行时刻每个协程维护一个栈,这个栈是预申请的内存段,它被作为一个内存池供开辟内存使用。每个协程的初始栈比较小,协程在运行时候将按照需要进行增长或收缩一个协程开辟在栈上的内存只能在此协程内部被引用,其它协程是无法访问的。 在栈上开辟内存块要比堆上快的多。 在栈上开辟的内存块不需要被垃圾回收处理。 当一个协程的栈大小改变时,一个新的内存段将申请给此栈使用。原先内存...

Go语言中sync.Cond的用法

The usage of sync.Cond in Golang

如果有一个任务需要满足一定条件才可以执行。一般都会想到使用channel可以实现,但是channel的方式比较适用于一对一的方式,一对多的话并不是很合适,这时候就可以使用sync.Cond,它可以实现多个协程间的通知。 sync.Cond值有一个sync.Locker类型的命名为L的字段,L具体值通常为*sync.Mutex或者*sync.RWMutex。 1 2 3 4 5 6 7 8...

Go语言之估值顺序

The Order of Variable Expression Valuation In Golang

按依赖顺序进行估值 1 2 3 4 5 6 7 8 9 10 var ( a1 = f("a1", a2) a2 = f("a2", a3) a3 = f("a3", 3) a4 = f("a4", 4) ) func f(s string, a int) int { fmt.Println(s) return a } 包级变量会按依赖顺...

openwrt软路由

Openwrt Soft Router

OpenWRT是一个高度模块化的嵌入式的Linux发行版,它拥有强大的网络组件和扩展性,常常被用于工控设备、智能家居、路由器等设备中。可以将它刷入固件作为路由器,也可以将它安装到虚拟机作为软路由。 今天由于意外断电导致ESXI重启了一次,之前用的routeros软路由读取磁盘失败而不能启动,短时间内不能马上处理好,便尝试用openwrt作为备用软路由方案。routeros比openwrt功...

Go语言之条件编译

Golang Conditional Compilation

一、编译标签 在文件头部添加一行注释 +build 用来指定编译条件。注意:+build 后必须留一行空格,否则会报重定义的错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // demo1.go // +build demo1 package main func Do(){ fmt.Println("demo1"...

React函数式组件使用生命周期和State

React Function Component use Hook and State

React中函数组件没有Class组件中的State和componentDitMount、componentDidUpdate等生命周期方法,不过可以通过React Hook实现。 使用State 1 2 3 4 5 6 7 8 9 10 import { useState } from 'react'; function ComponentA () { const [count...

Nginx与后端上游服务保持长连接

nginx upstream connection keepalive

问题 如果使用了Nginx作为反向代理或者负载均衡,在高并发下若发现Nginx服务器上产生了大量TIME-WAIT的连接,那就需要检查下Nginx与后端的上游服务器之间是否保持了长连接。 默认情况下,从客户端过来的长连接请求会被转换成短连接发送给后端的上游服务器,即upstream。 可通过tcpdump抓包观察或者配置Nginx upstream转发到 nc 监听的端口: 1 2 ...

Go语言之unsafe

Golang Unsafe Pointer

Go语言类型系统是为了保证安全和效率设计的,但保证安全的同时也会使程序效率低下。unsafe包可以绕过Go语言的类型系统限制,直接对内存进行读写操作。例如我们通常不能操作一个未导出的变量,但是通过unsafe包就可以做到。 unsafe包提供了三个函数,它们都作用于编译期间: 1 2 3 func Sizeof(x ArbitraryType) uintptr //返回类型所占用的字节数...

Go语言之浮点数

Golang float

1 2 3 var f1 float64 = 0.1 var f2 float64 = 0.2 fmt.Println(f1 + f2) 上面这段简单的程序你以为会输出0.3,但实际输出的是0.30000000000000004。 我们知道计算机中的数据都是二进制存储的,问题也在于计算机中的小数是被表示成二进制存储而无限接近于实际值。 看一下十进制小数0.1转二进制的过程: 1 2...

将Github仓库镜像同步到自建Git仓库

Using GitHub token to synchronize mirror repository to self git repository

虽然有自建的Git仓库但使用频率不是很高,一般安全性较高的数据、脚本和代码使用自建的Git仓库,比如salt pillar、jenkinsfile等。平常还是使用Github托管代码,为了安全着想,准备把代码镜像备份一下。 Gitlab或Gitea等自建的平台都提供有Git代码镜像的功能,可以设置每隔一段时间进行一次代码拉取同步。Gitea只能通过帐号密码的方式进行同步,而直接使用帐号密码...