参考:
官方文档:
http://golang.org/cmd/cgo/
http://blog.golang.org/2011/03/c-go-cgo.html
一份博文,编译过程讲得比较细:
http://googollee.blog.163.com/blog/static/1159411201031812128593/
Go语言教程:使用C语言函数:
http://chaishushan.blog.163.com/blog/static/130192897201012710273283/
看完上面的教程,基本上知道怎么用Go调用C代码、和需要注意的事项。
至于C调用Go的代码,Go调用汇编代码,以后再研究吧。
以下内容是笔记,列出一些重点等,不解释。
源文件
/*
// 这是注释中的注释
#include <stdio.h>
#include <errno.h>
*/
import "C"
// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo linux CFLAGS: -DLINUX=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"
// #cgo pkg-config: png cairo
// #include <png.h>
import "C"
编译方法
include $(GOROOT)/src/Make.inc
TARG=xdb
CGOFILES=xdb.go
CGO_CFLAGS+=-L/opt/xunsearch/lib/ -I/opt/xunsearch/include
CGO_LDFLAGS+=-lscws -L/opt/xunsearch/lib/
include $(GOROOT)/src/Make.pkg
说明:CFlags等参数,可以写在Go的源代码中
数据类型转换
C -> Go
int(C.int )
// C string to Go string
func C.GoString(*C.char) string
// C string, length to Go string
func C.GoStringN(*C.char, C.int) string
// C pointer, length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
Go -> C
C.char
C.schar (signed char)
C.uchar (unsigned char)
C.short
C.ushort (unsigned short)
C.int
C.uint (unsigned int)
C.long
C.ulong (unsigned long)
C.longlong (long long)
C.ulonglong (unsigned long long)
C.float
C.double.
unsafe.Pointer (void*)
// Go string to C string
func C.CString(string) *C.char
var val []byte
(*C.char)(unsafe.Pointer(&val[0]))
内存释放
cs := C.CString(s)
defer C.free(unsafe.Pointer(cs))
Go创建的对象,可以很好的回收;而C创建的,则需要手动回收
注意事项:
不支持调用像 Printf()
不清楚的地方,问人,或者看别人用Go调用C的代码。
(待完善)
http://googollee.blog.163.com/blog/static/1159411201031812128593/
http://my.oschina.net/zengsai/blog/5138
http://my.oschina.net/zengsai/blog/5139
分享到:
相关推荐
Go语言,又称Golang,是一种静态类型的编程语言,由Google开发,于2007年首次对外公布,并在2009年进行了开源。Go语言的设计哲学是简洁、快速和安全。它支持垃圾回收,具有类型系统和一些并发控制机制。 变量的定义...
Go语言,又称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。本学习笔记主要涵盖了Go语言的基础知识,包括类型、表达式、函数、数据结构、方法、接口、并发以及包管理等...
根据提供的文件内容,以下是对Go语言学习笔记的详细知识点阐述。 Go语言是Google开发的一种静态类型、编译型、并发型,并具有垃圾回收功能的编程语言。它由Robert Griesemer、Rob Pike和Ken Thompson于2007年9月...
Go语言学习笔记的知识点涵盖广泛,它从基础的语法到高级的并发编程,再到源码的剖析,全面介绍了Go语言的特点和编程技巧。以下是根据所提供的文件内容提取的知识点: 1. Go语言基础:Go是一种静态类型编程语言,...
Go语言的进阶特性包括对内存布局的理解、指针的高级用法,以及对cgo的支持,后者允许Go调用C语言函数,这在与遗留系统交互时非常有用。反射(reflect)包提供了一种在运行时动态获取类型信息和修改变量值的能力。 Go...
《雨痕golang学习笔记第四版 加上书签版》是针对Go语言学习者的参考资料,作者雨痕在书中详细记录了从2012年开始学习Go语言至今的经验与成果。本书内容全面,涵盖了Go语言的基础知识、数据结构、函数特性、并发编程...
Go语言的进阶知识包括内存布局、指针陷阱、cgo(调用C语言代码的接口)以及Reflect(反射)机制等。其中反射机制允许程序在运行时访问、检测和修改对象的行为,是动态类型语言特性在Go中的体现。 Go语言笔记的第二...
- **定义**: 允许 Go 代码调用 C 代码。 - **使用**: 通过编写 C 代码并将其与 Go 代码链接来实现。 #### 9.4 Reflect - **定义**: 提供了一种在运行时检查和操作对象的方式。 - **使用**: 用于动态类型处理和实现...
Go+学习笔记所包含的知识点涵盖了Go语言的基础知识、编程范式、数据结构、并发处理、标准库使用以及进阶话题等多个方面,详细介绍了Go语言的学习路径和应用实践。 首先,Go语言的基础部分包括变量声明、基本类型、...
- **cgo**:在Go中调用C语言代码的工具。 - **Reflect**:反射机制在Go中的实现和使用。 第三部分是关于源码和工具的介绍,包括内存分配器、垃圾回收器、Goroutine调度器以及Channel、Defer和Finalizer等内容。...
- **cgo**:允许Go代码调用C语言编写的库。 - **反射**:可以动态地获取和操作对象的类型和值。 以上内容涵盖了Go语言的基本概念和核心知识点。对于初学者来说,理解这些概念是学习Go的基础。随着经验的积累,...
《Go学习笔记第二版1》是一本记录Go语言学习过程的笔记,作者通过两年的实践积累了丰富的经验,并针对Go语言的不断更新进行了修订。新版笔记重新规划了目录结构,将语言特性和工具分开,不再包括易变的标准库内容,...
第9章进阶:涉及到内存布局、指针陷阱、cgo(用于Go调用C代码)以及反射(reflect)等高级特性。 第二部分是关于源码的理解,包括内存分配器、垃圾回收器和goroutine调度器的源码分析。 第三部分附录介绍了工具的...
- **cgo**: C语言和Go语言之间的互操作。 - **性能测试**: 测试Go程序的性能。 - **源码阅读指南**: 指导如何阅读和理解Go标准库及第三方库的源码。 以上知识点概括了雨痕的GO学习笔记中涉及的主要内容,适合初学者...
- **cgo**: 介绍如何使用cgo来调用C语言编写的库。 #### 总结 本书通过一系列的章节详细介绍了Go语言的核心概念和技术细节,从基本的语法到高级的并发编程技术都有涉及。无论是初学者还是有经验的开发者,都可以从...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。Go语言的设计目标是提高开发效率,简化并发编程,并提供高效的网络和系统级编程能力。 在Go语言的学习中,首先要...
首先,文档的标题“【_cjl***_book】 Go 学习笔记.pdf”暗示了这是关于Go语言(也称为Golang)的学习笔记。Go语言是由Google开发的一种静态类型、编译型语言,它具有简洁、快速、安全的特点,适合于网络编程和多核心...
- **定义**: Go 语言提供了 cgo 工具来调用 C 语言代码。 - **用途**: 适用于需要与 C 语言交互的情况。 #### 9.4 Reflect - **定义**: Go 语言的反射机制允许程序在运行时检查和修改任何类型的值。 - **用途**: ...