- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
02.5.1 Go Package
Go Package
本节将展示C示例程序用到的 Go package
代码。 Go package
的名字必须是 main
,但是文件名可以随意,我们的例子中,文件名是 usedByC.go
,分三部分展示。
你可能不了解 Go package
机制,在第六章会详细的介绍。
第一部分的 Go package
代码:
> package main
>
> import "C"
>
> import (
> "fmt"
> )
前面提到, Go package
的名字必须是 main
,同样的也需要导入"C" package
。
第二部分的代码如下:
> //export PrintMessage
> func PrintMessage() {
> fmt.Println("A Go function!")
> }
如果一个Go函数想要被C语言调用,必须要先导出。你应该在函数实现的开始部分,添加一行以 export
开头的注释, export
后面要加上函数的名字,这样C程序才知道怎么使用。
最后一部分的代码:
> //export Multiply
> func Multiply(a, b int) int {
> return a * b
> }
> func main() {
> }
这个 main()
函数不需要任何的函数体,因为不需要导出给C代码使用,同样的,要导出 Multiply
函数,也需要将//export Multiply
注释添加到函数实现之前。
接着,你需要用Go代码生成一个C共享库,命令如下:
> $ go build -o usedByC.o -buildmode=c-shared usedByC.go
上面的命令会产生 usedByC.h
和 usedByC.o
两个文件。
> $ ls -l usedByC.*
> -rw-r--r--@ 1 mtsouk staff
> 204
> -rw-r--r-- 1 mtsouk staff
> 1365
> -rw-r--r-- 1 mtsouk staff 2329472
> $ file usedByC.o
> usedByC.o: Mach-O 64-bit dynamically
> Oct 31 20:37 usedByC.go
> Oct 31 20:40 usedByC.h
> Oct 31 20:40 usedByC.o
> linked shared library x86_64
注意:不要修改 usedByC.h
文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论