mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 04:22:22 +00:00
重新调整cgo目录结构
This commit is contained in:
parent
5787cf8467
commit
85ef6e6a36
20
SUMMARY.md
20
SUMMARY.md
@ -10,14 +10,18 @@
|
|||||||
* [1.7. 错误和异常](ch1-basic/ch1-07-error-and-panic.md)
|
* [1.7. 错误和异常](ch1-basic/ch1-07-error-and-panic.md)
|
||||||
* [1.8. 配置开发环境](ch1-basic/ch1-08-ide.md)
|
* [1.8. 配置开发环境](ch1-basic/ch1-08-ide.md)
|
||||||
* [第二章 CGO编程](ch2-cgo/readme.md)
|
* [第二章 CGO编程](ch2-cgo/readme.md)
|
||||||
* [2.1. 你好, CGO!](ch2-cgo/ch2-01-hello-cgo.md)
|
* [2.1. 快速入门](ch2-cgo/ch2-01-hello-cgo.md)
|
||||||
* [2.2. 基础类型转换](ch2-cgo/ch2-02-cgo-types.md)
|
* [2.2. CGO编程基础](ch2-cgo/ch2-02-basic.md)
|
||||||
* [2.3. CGO编程基础](ch2-cgo/ch2-03-basic.md)
|
* [2.3. 类型转换](ch2-cgo/ch2-03-cgo-types.md)
|
||||||
* [2.4. CGO内存模型](ch2-cgo/ch2-04-memory.md)
|
* [2.4. 函数调用](ch2-cgo/ch2-04-func.md)
|
||||||
* [2.5. C++类包装](ch2-cgo/ch2-05-class.md)
|
* [2.5. 内部机制](ch2-cgo/ch2-05-internal.md)
|
||||||
* [2.6. 静态库和动态库](ch2-cgo/ch2-06-static-shared-lib.md)
|
* [2.6. 实战: 封装qsort](ch2-cgo/ch2-06-qsort.md)
|
||||||
* [2.7. Go实现Python模块](ch2-cgo/ch2-07-py-module.md)
|
* [2.7. CGO内存模型](ch2-cgo/ch2-07-memory.md)
|
||||||
* [2.8. 补充说明](ch2-cgo/ch2-08-faq.md)
|
* [2.8. C++类包装](ch2-cgo/ch2-08-class.md)
|
||||||
|
* [2.9. 静态库和动态库](ch2-cgo/ch2-09-static-shared-lib.md)
|
||||||
|
* [2.10. Go实现Python模块](ch2-cgo/ch2-10-py-module.md)
|
||||||
|
* [2.11. 编译和链接参数](ch2-cgo/ch2-11-link.md)
|
||||||
|
* [2.12. 补充说明](ch2-cgo/ch2-12-faq.md)
|
||||||
* [第三章 汇编语言(TODO)](ch3-asm/readme.md)
|
* [第三章 汇编语言(TODO)](ch3-asm/readme.md)
|
||||||
* [3.1. 汇编基础(TODO)](ch3-asm/ch3-01-basic.md)
|
* [3.1. 汇编基础(TODO)](ch3-asm/ch3-01-basic.md)
|
||||||
* [3.2. 控制流(TODO)](ch3-asm/ch3-02-control-flow.md)
|
* [3.2. 控制流(TODO)](ch3-asm/ch3-02-control-flow.md)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# 2.1. 你好, CGO!
|
# 2.1. 快速入门
|
||||||
|
|
||||||
在第一章的“Hello, World 的革命”一节中,我们已经见过一个CGO程序。这一节我们将重新给出三个版本的CGO实现,来简单展示CGO的用法。
|
在第一章的“Hello, World 的革命”一节中,我们已经见过一个CGO程序。这一节我们将重新给出三个版本的CGO实现,来简单展示CGO的用法。
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# 2.3. CGO编程基础
|
# 2.2. CGO编程基础
|
||||||
|
|
||||||
Go是一门以实用为主要目的的编程语言,我们可以通过cgo来直接调用C语言代码,也可以在C语言代码中直接调用Go函数。要使用CGO特性,需要安装C/C++构建工具链,在macOS和Linux下是要安装和GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量`CGO_ENABLED`被设置为1,这表示CGO是被启用的状态。在本地构建时`CGO_ENABLED`默认是启用的,当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序,需要手工设置好C/C++交叉构建的工具链,同时开启`CGO_ENABLED`环境变量。
|
Go是一门以实用为主要目的的编程语言,我们可以通过cgo来直接调用C语言代码,也可以在C语言代码中直接调用Go函数。要使用CGO特性,需要安装C/C++构建工具链,在macOS和Linux下是要安装和GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量`CGO_ENABLED`被设置为1,这表示CGO是被启用的状态。在本地构建时`CGO_ENABLED`默认是启用的,当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序,需要手工设置好C/C++交叉构建的工具链,同时开启`CGO_ENABLED`环境变量。
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# 2.2. 基础类型转换
|
# 2.3. 类型转换
|
||||||
|
|
||||||
最初CGO是为了达到方便从Go语言函数调用C语言函数以复用C语言资源这一目的而出现的(因为C语言还会涉及回调函数,自然也会涉及到从C语言函数调用Go语言函数)。现在,它已经演变为C语言和Go语言双向通讯的桥梁。要想利用好CGO特性,自然需要了解此二语言类型之间的转换规则,这是本节要讨论的问题。
|
最初CGO是为了达到方便从Go语言函数调用C语言函数以复用C语言资源这一目的而出现的(因为C语言还会涉及回调函数,自然也会涉及到从C语言函数调用Go语言函数)。现在,它已经演变为C语言和Go语言双向通讯的桥梁。要想利用好CGO特性,自然需要了解此二语言类型之间的转换规则,这是本节要讨论的问题。
|
||||||
|
|
1
ch2-cgo/ch2-04-func.md
Normal file
1
ch2-cgo/ch2-04-func.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# 2.4. 函数调用
|
1
ch2-cgo/ch2-05-internal.md
Normal file
1
ch2-cgo/ch2-05-internal.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# 2.5. 内部机制
|
1
ch2-cgo/ch2-06-qsort.md
Normal file
1
ch2-cgo/ch2-06-qsort.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# 2.6. 实战: 封装qsort
|
@ -1,4 +1,4 @@
|
|||||||
# 2.4. CGO内存模型
|
# 2.7. CGO内存模型
|
||||||
|
|
||||||
CGO是架接Go语言和C语言的桥梁,它使二者在二进制接口层面实现了互通,但是我们要注意因两种语言的内存模型的差异而可能引起的问题。如果在CGO处理的跨语言函数调用时涉及到了指针的传递,则可能会出现Go语言和C语言共享某一段内存的场景。我们知道C语言的内存在分配之后就是稳定的,但是Go语言因为函数栈的动态伸缩可能导致栈中内存地址的移动(这是Go和C内存模型的最大差异)。如果C语言持有的是移动之前的Go指针,那么以旧指针访问Go对象时会导致程序崩溃。
|
CGO是架接Go语言和C语言的桥梁,它使二者在二进制接口层面实现了互通,但是我们要注意因两种语言的内存模型的差异而可能引起的问题。如果在CGO处理的跨语言函数调用时涉及到了指针的传递,则可能会出现Go语言和C语言共享某一段内存的场景。我们知道C语言的内存在分配之后就是稳定的,但是Go语言因为函数栈的动态伸缩可能导致栈中内存地址的移动(这是Go和C内存模型的最大差异)。如果C语言持有的是移动之前的Go指针,那么以旧指针访问Go对象时会导致程序崩溃。
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# 2.5. C++ 类包装
|
# 2.8. C++ 类包装
|
||||||
|
|
||||||
CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。CGO不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。一个C++类的构造函数在编译为目标文件时如何生成链接符号名称、方法在不同平台甚至是C++的不同版本之间都是不一样的。但是C++是兼容C语言,所以我们可以通过增加一组C语言函数接口作为C++类和CGO之间的桥梁,这样就可以间接地实现C++和Go之间的互联。当然,因为CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。
|
CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。CGO不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。一个C++类的构造函数在编译为目标文件时如何生成链接符号名称、方法在不同平台甚至是C++的不同版本之间都是不一样的。但是C++是兼容C语言,所以我们可以通过增加一组C语言函数接口作为C++类和CGO之间的桥梁,这样就可以间接地实现C++和Go之间的互联。当然,因为CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# 2.6. 静态库和动态库
|
# 2.9. 静态库和动态库
|
||||||
|
|
||||||
CGO在使用C/C++资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在`import "C"`之前的注释部分包含C代码,或者在当前包中包含C/C++源文件。链接静态库和动态库的方式比较类似,都是通过在LDFLAGS选项指定要链接的库方式链接。本节我们主要关注在CGO中如何使用静态库和动态库相关的问题。
|
CGO在使用C/C++资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在`import "C"`之前的注释部分包含C代码,或者在当前包中包含C/C++源文件。链接静态库和动态库的方式比较类似,都是通过在LDFLAGS选项指定要链接的库方式链接。本节我们主要关注在CGO中如何使用静态库和动态库相关的问题。
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
# 2.7 Go实现Python模块
|
# 2.10 Go实现Python模块
|
||||||
|
|
||||||
前面章节我们已经讲述了如何通过CGO来引用和创建C动态库和静态库。实现了对C动态库和静态库的支持,理论上就可以应用到动态库的绝大部分场景。Python语言作为当下最红的语言,本节我们将演示如何通过Go语言来为Python脚本语言编写扩展模块。
|
前面章节我们已经讲述了如何通过CGO来引用和创建C动态库和静态库。实现了对C动态库和静态库的支持,理论上就可以应用到动态库的绝大部分场景。Python语言作为当下最红的语言,本节我们将演示如何通过Go语言来为Python脚本语言编写扩展模块。
|
||||||
|
|
1
ch2-cgo/ch2-11-link.md
Normal file
1
ch2-cgo/ch2-11-link.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# 2.11. 编译和链接参数
|
@ -1,4 +1,4 @@
|
|||||||
# 2.8. 补充说明
|
# 2.12. 补充说明
|
||||||
|
|
||||||
为何要话费巨大的精力学习CGO是一个问题。任何技术和语言都有它自身的优点和不足,Go语言不是银弹,它无法解决全部问题。而通过CGO可以继承C/C++将近半个世纪的软件遗产,通过CGO可以用Go给其它系统写C接口的共享库,通过CGO技术可以让Go语言编写的代码可以很好地融入现有的软件生态——而现在的软件正式建立在C/C++语言之上的。因此说CGO是一个保底的后备技术,它是Go的一个重量级的替补技术,值得任何一个严肃的Go语言开发人员学习。
|
为何要话费巨大的精力学习CGO是一个问题。任何技术和语言都有它自身的优点和不足,Go语言不是银弹,它无法解决全部问题。而通过CGO可以继承C/C++将近半个世纪的软件遗产,通过CGO可以用Go给其它系统写C接口的共享库,通过CGO技术可以让Go语言编写的代码可以很好地融入现有的软件生态——而现在的软件正式建立在C/C++语言之上的。因此说CGO是一个保底的后备技术,它是Go的一个重量级的替补技术,值得任何一个严肃的Go语言开发人员学习。
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user