golng 中的 cgo

2021-06-23  本文已影响0人  追风骚年

今天体验了一下 golang 的 cgo 部分,发现 golang 确实太强,调用 c 语言部分直接像是原生操作,go 自己倒变成了一个黏胶语言了,如果我有很多比较底层的 c 库,完全可以用 go 来进行连接。

可以把 go 的特性带给 c 程序员,把 c 的性能和基础 lib 又送给 go 程序员。

做了一个小实验

package main

/*
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

static char* cat(char* str1, char* str2) {
    static char buf[256];
    strcpy(buf, str1);
    strcat(buf, str2);

    return buf;
}
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    str1, str2 := "hello", " world"
    // golang string -> c string
    cstr1, cstr2 := C.CString(str1), C.CString(str2)
    defer C.free(unsafe.Pointer(cstr1)) // must call
    defer C.free(unsafe.Pointer(cstr2))
    cstr3 := C.cat(cstr1, cstr2)
    // c string -> golang string
    str3 := C.GoString(cstr3)
    fmt.Println(str3) // "hello world"
}

free 函数是 c 的标准库里面的,cat 是顶部注释部分实现的一个函数,在 goland 中显示和操作这部分 c 代码还是很方便的清晰的。

上一篇下一篇

猜你喜欢

热点阅读