New Blog

使用 Hugo 重新搭建了自己的博客 会先把原 CSDN博客 迁移过来 然后更新自己的一些感想和技术文章 欢迎关注……

阅读全文

git commit 规范化信息提交工具

灵感来源于 这篇文章 1.标准化 commit message 规范且有意义的提交记录,有助于追踪代码修改和查看历史记录 现在支持以下九种类型(参考 Angular 规范的 commit message) feat: 新功能(feature) fix: 修补bug docs: 文档(documentation) style: 格式(不影响代码运行的变动) refactor: 重构(……

阅读全文

Golang 八进制 utf-8 编码转中文

概览 当调试程序,打印出变量的值时,有可能输出的是八进制 utf-8 编码(尤其是 protobuf 变量) 例如:\346\200\241\346\200\241\346\200 这样的字符串如果作为字面量,go 可以自动转化, 但如果是从文件或 string 中读取,就不行了。 可以使用正则表达式简单处理下 代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18……

阅读全文

Golang IP 地址字符串整数/string int 相互转换

概览 Go 中没有 C 语言 inet_aton 和 inet_ntoa 类似的转换 IP 函数, 所以需要手动封装两个函数 (转换的方法有多种,我选择了简洁的) 实现 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 package main import ( "fmt" "math/big" "net" ) func InetNtoA(ip int64) string { return fmt.Sprintf("%d.%d.%d.%d", byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip)) } func InetAtoN(ip string) int64 { ret := big.NewInt(0) ret.SetBytes(net.ParseIP(ip).To4()) return ret.Int64() } func main() { ip := "192.168.78.123" ipInt := InetAtoN(ip) fmt.Printf("convert string ip [%s] to int: %d\n", ip, ipInt) fmt.Printf("convert int ip [%d] to string: %s\n", ipInt, InetNtoA(ipInt)) } 注:InetAtoN 最……

阅读全文

MySQL 优化百分比/比例计算

概览 通常使用 SQL 语句求百分比时,需求扫描表两次,一次是总数一次是满足条件的个数 其实可以使用 INTERVAL 函数优化,只扫描表一次(在表很大时,几乎可以少花费一半的时间) 示例 假设有一个分数表 TScore,包含班级,学号,平均分这3个字段(class, no, score) 现在想求每个班级的及格率(>=60人数/总人数*……

阅读全文

MySQL select 子查询复用,进行聚合计算

概览 当对一个复杂的子查询结果进行分组(group by)聚合计算时, 有时需要进行多次聚合,如果不能复用自查寻的结果,查询效率会很低下 在有些情况下,可以使用 IF 函数进行不同条件的聚合 示例 假设子查询的结果有班级,学号,平均分这3个字段(class, no, score) 现在想求每个班级的总人数和及格人数 复用前 1 2 3……

阅读全文

MySQL 使用 INTERVAL() 函数 实现数据按区间分组

定义 首先看一下它的定义: 1 INTERVAL(N,N1,N2,N3,..........) INTERVAL() 函数进行比较列表(N1,N2,N3等等)中的N值。该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N为NULL,它将返回-1。列表值必须是N1<N2<N3的形式才能正常工作。 下面的代码是显示 INTERVAL() 函数如何工作的一个简单……

阅读全文

Go 循环跳转语句使用标签的作用之一

Go 中的 for 循环可以使用 continue, break 进行控制,同时也可以标签 下面看一下使用标签的一个好处 示例:Go 求 N 以内的素数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "fmt" ) func main() { printPrime(10) } func printPrime(maxNum int) { next: for outer := 2; outer < maxNum; outer++ { for inner := 2; inner < outer; inner++ { if outer%inner == 0 { continue next } } fmt.Printf("%d\n", outer) } fmt.Println("Completed") } 再看一下用C语言实现的(C 的 continue, break 不支持标签) 1 2 3 4 5 6 7 8……

阅读全文

c/c++ max/min 4种实现方法

1.简单的宏实现 1 2 #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) 2.内核的宏实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* safe min & max */ /* avoid ++/-- expand twice */ /* compile warning if type diff */ #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) #define max(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void) (&_max1 == &_max2); \ _max1 > _max2 ? _max1 : _max2; }) Linux 内核的实现是安全的,避免了 ++/– 计算多次,而且会在编……

阅读全文

线程创建 pthread_create 中自定义参数注意事项

1.函数原型 1 2 int **pthread_create**(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 本文主要讨论最后一个参数,同时传递多个的问题 (如果只传递一个 int char 等长度小于指针的数据类型,可以直接传,然后在线程内把 (void *) 强制转换) 2.错误示例 是在一本书上看到的,也是写本文的初衷 错误原因: fds_for_new_worker 是局部变量,线程创建异步的,pthread_create 后, else if 也结束……

阅读全文

最近文章

分类

标签

其它