Posted on 2014-03-10 23:47:03 golang
摘要:在Golang中字符串的一个坑这篇博文中,介绍了Golang中字符串与C中的字符串的不同之处:C中的字符串是以\x0
为结尾的字节序列,而Golang中的字符串则更严格,并不是以\x0
为结尾来判断,而是计算字符串变量的值中的所有字节。
Golang中的字符串在打印时,因为\x0
是不可打印字符,所以和C中的字符串在打印时没有任何区别。但是在一些需要按字节计算字符串的函数中,就会导致问题。通用的做法是,迭代字符串,只取得字节序列中的有效字节。
我们可以写一个函数来做这件事情,也可以用Golang的标准库中的bytes
库。bytes
库提供了对[]byte
类型的操作,提供的接口和对string
类型提供的接口类似。
Posted on 2014-03-08 12:58:08 http
摘要:在前一片博文中介绍了http-parser
的使用简介,只是对官方http-parser
使用简介的翻译,并加上个人的理解进去。对于在实际中使用,还有很多需要注意的地方,下面的代码给出实际中的使用方法。
代码中包括以下类型的HTTP消息的解析:
Posted on 2014-03-08 12:55:57 http
摘要:http-parser是一个用C代码编写的HTTP消息解析器。可以解析HTTP请求或者回应消息。 这个解析器常常在高性能的HTTP应用中使用。 在解析的过程中,它不会调用任何系统调用,不会在HEAP上申请内存,不会缓存数据,并且可以在任意时刻打断解析过程,而不会产生任何影响。 对于每个HTTP消息(在WEB服务器中就是每个请求),它只需要40字节的内存占用(解析器本身的基本数据结构),不过最终的要看你实际的代码架构。
阅读全文Posted on 2014-03-05 22:44:56 golang
下面的总结是最近Golang开发中遇到的,和互联网上搜集到的坑,会持续更新:
字符串不是以\x0
结束作为判断的
无锁队列只是在单核下,多核同样需要锁,需要线程间调度
格式化时间字符串只能用2006 01 02 15 04 05
(时间原点), 并且在time/format.go
写死了:
2006-01-02T15:04:05Z07:00
其实这是有意义的,每个字段正好对应:
1 2 3 4 5 6 7
月 日 时 分 秒 年 时区
当多个channel都处于就绪状态时,激活channel是随机的,不能按照顺序判断
os.exit(1)
执行后,defer是没有作用的
Goroutine只有非阻塞的IO调用阻塞时,才会发生Goroutine切换,如果是系统调用:
Golang会直接启动内核级线程
,来实现异步。。。所以避免大量启动系统调用。。。
内存泄漏的一个坑 如果你的代码中出现这样,恭喜你,你已经在坑里。
func somefunc() {
for {
// ...
defer something.Cleanup()
}
}
原因是这里的defer没有机会被执行到。 简单的解决办法是将这里的逻辑放到一个方法中去。