对于cgo的简单测试,运用scws分词库类源码实现分词。
代码:https://github.com/lobo-a/goproject
1、下载源码 http://www.xunsearch.com/scws/docs.php (本示例使用的是 1.2.3 版本)
2、解压scws包,进入目录,./configure 编译但不需要安装,会生成一个 config.h(这是我们需要的)
3、在go代码文件创建目录libscws
4、将scws目录下的config.h 和 其子目录libscws 下的文件全部拷贝到你的go代码目录libscws中
golang测试代码如下:
package main
/*
#cgo CFLAGS: -I${SRCDIR}/libscws
#cgo LDFLAGS: -L${SRCDIR}/libscws
#include <config.h>
#include <scws.c>
#include <charset.c>
#include <darray.c>
#include <lock.c>
#include <pool.c>
#include <rule.c>
#include <crc32.c>
#include <xdb.c>
#include <xdict.c>
#include <xtree.c>
*/
import "C"
import "unsafe"
import (
"fmt"
)
func main() {
xattr := C.CString("")
defer C.free(unsafe.Pointer(xattr))
text := C.CString("2008年中国网络游戏的实际销售收入达183.8亿元人民币,比2007年增长了百分之76.6")
defer C.free(unsafe.Pointer(text))
scws := C.scws_new()
defer C.scws_free(scws)
C.scws_set_charset(scws, C.CString("utf8"))
// C.scws_set_debug(scws, C.SCWS_NA)
// C.scws_set_ignore(scws, C.SCWS_YEA)
C.scws_set_dict(scws, C.CString("etc/scws_dict_utf8.xdb"), C.SCWS_XDICT_XDB)
C.scws_set_rule(scws, C.CString("etc/scws_rules_utf8.ini"))
C.scws_send_text(scws, text, C.int(C.strlen(text)))
tops := C.scws_get_tops(scws, C.int(10), xattr)
defer C.scws_free_tops(tops);
if tops != nil {
num := 0;
cur := tops
for {
num++
if cur == nil || num>20 {
break;
}
fmt.Printf("idx:%d, word: %s, weight: %f \n", num, C.GoString(cur.word), cur.weight)
cur = cur.next
}
}
}
参考:https://golang.org/src/cmd/cgo/doc.go
为了得到c的性能,确实挺麻烦的,需要注意c申请资源的释放工作
有疑问加站长微信联系(非本文作者)