docker中import "C"的用法,Go与C语言的互操作

2016-12-02 12:52:50来源:网络收集作者:管理员人点击

在读docker判断存储的driver时,有这样一块代码:

func dmSetDevDirFct(dir string) int { Cdir := C.CString(dir) defer free(Cdir) return int(C.dm_set_dev_dir(Cdir)) }

这一块代码是直接调用c语言的接口的,在文件的头部可以发现c语言的定义方法:

/* #cgo LDFLAGS: -L. -ldevmapper #include #include // FIXME: present only for BLKGETSIZE64, maybe we can remove it? // FIXME: Can't we find a way to do the logging in pure Go? extern void DevmapperLogCallback(int level, char *file, int line, int dm_errno_or_class, char *str); static void log_cb(int level, const char *file, int line, int dm_errno_or_class, const char *f, ...) { char buffer[256]; va_list ap; va_start(ap, f); vsnprintf(buffer, 256, f, ap); va_end(ap); DevmapperLogCallback(level, (char *)file, line, dm_errno_or_class, buffer); } static void log_with_errno_init() { dm_log_with_errno_init(log_cb); } */ import "C"
由此可见,go与c是可以互操作的。介绍下go与c的互操作:

Go有强烈的C背景,除了语法具有继承性外,其设计者以及其设计目标都与C语言有着千丝万缕的联系。在Go与C语言互操作(Interoperability)方面,Go更是提供了强大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,这是其他语言所无法望其项背的。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台