找到归档 2014-03 的文章 4 篇.


Golang中操作[]byte类型的Trim函数

Posted on 2014-03-10 23:47:03 golang

摘要:

Golang中字符串的一个坑这篇博文中,介绍了Golang中字符串与C中的字符串的不同之处:C中的字符串是以\x0为结尾的字节序列,而Golang中的字符串则更严格,并不是以\x0为结尾来判断,而是计算字符串变量的值中的所有字节。

Golang中的字符串在打印时,因为\x0是不可打印字符,所以和C中的字符串在打印时没有任何区别。但是在一些需要按字节计算字符串的函数中,就会导致问题。通用的做法是,迭代字符串,只取得字节序列中的有效字节。

我们可以写一个函数来做这件事情,也可以用Golang的标准库中的bytes库。bytes库提供了对[]byte类型的操作,提供的接口和对string类型提供的接口类似。

阅读全文

http-parser实际解析过程

Posted on 2014-03-08 12:58:08 http

摘要:

前一片博文中介绍了http-parser的使用简介,只是对官方http-parser使用简介的翻译,并加上个人的理解进去。对于在实际中使用,还有很多需要注意的地方,下面的代码给出实际中的使用方法。

代码中包括以下类型的HTTP消息的解析:

  • GET报文
  • POST报文,含有BODY
  • trunk编码的报文,在trunk编码后含有拖挂的字段
  • trunk编码的报文,以多个0表示trunk编码的结束
  • 将一个完整的trunk编码的报文,分为两次解析
阅读全文

http-parser使用简介

Posted on 2014-03-08 12:55:57 http

摘要:

http-parser是一个用C代码编写的HTTP消息解析器。可以解析HTTP请求或者回应消息。 这个解析器常常在高性能的HTTP应用中使用。 在解析的过程中,它不会调用任何系统调用,不会在HEAP上申请内存,不会缓存数据,并且可以在任意时刻打断解析过程,而不会产生任何影响。 对于每个HTTP消息(在WEB服务器中就是每个请求),它只需要40字节的内存占用(解析器本身的基本数据结构),不过最终的要看你实际的代码架构。

阅读全文

Golang中的各种坑(持续更新)

Posted on 2014-03-05 22:44:56 golang

下面的总结是最近Golang开发中遇到的,和互联网上搜集到的坑,会持续更新:

  1. 字符串不是以\x0结束作为判断的

  2. 无锁队列只是在单核下,多核同样需要锁,需要线程间调度

  3. 格式化时间字符串只能用2006 01 02 15 04 05(时间原点), 并且在time/format.go写死了:

    2006-01-02T15:04:05Z07:00

    其实这是有意义的,每个字段正好对应:

    1 2 3 4 5 6 7
        
    月 日 时 分 秒 年 时区
    
  4. 当多个channel都处于就绪状态时,激活channel是随机的,不能按照顺序判断

  5. os.exit(1)执行后,defer是没有作用的

  6. Goroutine只有非阻塞的IO调用阻塞时,才会发生Goroutine切换,如果是系统调用:

    Golang会直接启动内核级线程,来实现异步。。。所以避免大量启动系统调用。。。

  7. 内存泄漏的一个坑 如果你的代码中出现这样,恭喜你,你已经在坑里。

    func somefunc() {
        for {
            // ...
            defer something.Cleanup()
        }
    }
    

    原因是这里的defer没有机会被执行到。 简单的解决办法是将这里的逻辑放到一个方法中去。