From 85ef6e6a368add871eef158f2d6a219d0f9d5449 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Mon, 23 Apr 2018 13:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=B0=83=E6=95=B4cgo?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 20 +++++++++++-------- ch2-cgo/ch2-01-hello-cgo.md | 2 +- ch2-cgo/{ch2-03-basic.md => ch2-02-basic.md} | 2 +- ...h2-02-cgo-types.md => ch2-03-cgo-types.md} | 2 +- ch2-cgo/ch2-04-func.md | 1 + ch2-cgo/ch2-05-internal.md | 1 + ch2-cgo/ch2-06-qsort.md | 1 + .../{ch2-04-memory.md => ch2-07-memory.md} | 2 +- ch2-cgo/{ch2-05-class.md => ch2-08-class.md} | 2 +- ...red-lib.md => ch2-09-static-shared-lib.md} | 2 +- ...h2-07-py-module.md => ch2-10-py-module.md} | 2 +- ch2-cgo/ch2-11-link.md | 1 + ch2-cgo/{ch2-08-faq.md => ch2-12-faq.md} | 2 +- 13 files changed, 24 insertions(+), 16 deletions(-) rename ch2-cgo/{ch2-03-basic.md => ch2-02-basic.md} (99%) rename ch2-cgo/{ch2-02-cgo-types.md => ch2-03-cgo-types.md} (99%) create mode 100644 ch2-cgo/ch2-04-func.md create mode 100644 ch2-cgo/ch2-05-internal.md create mode 100644 ch2-cgo/ch2-06-qsort.md rename ch2-cgo/{ch2-04-memory.md => ch2-07-memory.md} (99%) rename ch2-cgo/{ch2-05-class.md => ch2-08-class.md} (99%) rename ch2-cgo/{ch2-06-static-shared-lib.md => ch2-09-static-shared-lib.md} (99%) rename ch2-cgo/{ch2-07-py-module.md => ch2-10-py-module.md} (99%) create mode 100644 ch2-cgo/ch2-11-link.md rename ch2-cgo/{ch2-08-faq.md => ch2-12-faq.md} (98%) diff --git a/SUMMARY.md b/SUMMARY.md index 1858a04..4c26019 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -10,14 +10,18 @@ * [1.7. 错误和异常](ch1-basic/ch1-07-error-and-panic.md) * [1.8. 配置开发环境](ch1-basic/ch1-08-ide.md) * [第二章 CGO编程](ch2-cgo/readme.md) - * [2.1. 你好, CGO!](ch2-cgo/ch2-01-hello-cgo.md) - * [2.2. 基础类型转换](ch2-cgo/ch2-02-cgo-types.md) - * [2.3. CGO编程基础](ch2-cgo/ch2-03-basic.md) - * [2.4. CGO内存模型](ch2-cgo/ch2-04-memory.md) - * [2.5. C++类包装](ch2-cgo/ch2-05-class.md) - * [2.6. 静态库和动态库](ch2-cgo/ch2-06-static-shared-lib.md) - * [2.7. Go实现Python模块](ch2-cgo/ch2-07-py-module.md) - * [2.8. 补充说明](ch2-cgo/ch2-08-faq.md) + * [2.1. 快速入门](ch2-cgo/ch2-01-hello-cgo.md) + * [2.2. CGO编程基础](ch2-cgo/ch2-02-basic.md) + * [2.3. 类型转换](ch2-cgo/ch2-03-cgo-types.md) + * [2.4. 函数调用](ch2-cgo/ch2-04-func.md) + * [2.5. 内部机制](ch2-cgo/ch2-05-internal.md) + * [2.6. 实战: 封装qsort](ch2-cgo/ch2-06-qsort.md) + * [2.7. CGO内存模型](ch2-cgo/ch2-07-memory.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) * [3.1. 汇编基础(TODO)](ch3-asm/ch3-01-basic.md) * [3.2. 控制流(TODO)](ch3-asm/ch3-02-control-flow.md) diff --git a/ch2-cgo/ch2-01-hello-cgo.md b/ch2-cgo/ch2-01-hello-cgo.md index 3ec308f..2e03c27 100644 --- a/ch2-cgo/ch2-01-hello-cgo.md +++ b/ch2-cgo/ch2-01-hello-cgo.md @@ -1,4 +1,4 @@ -# 2.1. 你好, CGO! +# 2.1. 快速入门 在第一章的“Hello, World 的革命”一节中,我们已经见过一个CGO程序。这一节我们将重新给出三个版本的CGO实现,来简单展示CGO的用法。 diff --git a/ch2-cgo/ch2-03-basic.md b/ch2-cgo/ch2-02-basic.md similarity index 99% rename from ch2-cgo/ch2-03-basic.md rename to ch2-cgo/ch2-02-basic.md index 503a4a2..1956c01 100644 --- a/ch2-cgo/ch2-03-basic.md +++ b/ch2-cgo/ch2-02-basic.md @@ -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`环境变量。 diff --git a/ch2-cgo/ch2-02-cgo-types.md b/ch2-cgo/ch2-03-cgo-types.md similarity index 99% rename from ch2-cgo/ch2-02-cgo-types.md rename to ch2-cgo/ch2-03-cgo-types.md index ee55f4d..a54c43d 100644 --- a/ch2-cgo/ch2-02-cgo-types.md +++ b/ch2-cgo/ch2-03-cgo-types.md @@ -1,4 +1,4 @@ -# 2.2. 基础类型转换 +# 2.3. 类型转换 最初CGO是为了达到方便从Go语言函数调用C语言函数以复用C语言资源这一目的而出现的(因为C语言还会涉及回调函数,自然也会涉及到从C语言函数调用Go语言函数)。现在,它已经演变为C语言和Go语言双向通讯的桥梁。要想利用好CGO特性,自然需要了解此二语言类型之间的转换规则,这是本节要讨论的问题。 diff --git a/ch2-cgo/ch2-04-func.md b/ch2-cgo/ch2-04-func.md new file mode 100644 index 0000000..ac032ff --- /dev/null +++ b/ch2-cgo/ch2-04-func.md @@ -0,0 +1 @@ +# 2.4. 函数调用 diff --git a/ch2-cgo/ch2-05-internal.md b/ch2-cgo/ch2-05-internal.md new file mode 100644 index 0000000..f2f57a9 --- /dev/null +++ b/ch2-cgo/ch2-05-internal.md @@ -0,0 +1 @@ +# 2.5. 内部机制 diff --git a/ch2-cgo/ch2-06-qsort.md b/ch2-cgo/ch2-06-qsort.md new file mode 100644 index 0000000..0aec3be --- /dev/null +++ b/ch2-cgo/ch2-06-qsort.md @@ -0,0 +1 @@ +# 2.6. 实战: 封装qsort diff --git a/ch2-cgo/ch2-04-memory.md b/ch2-cgo/ch2-07-memory.md similarity index 99% rename from ch2-cgo/ch2-04-memory.md rename to ch2-cgo/ch2-07-memory.md index e1f6759..c484e0d 100644 --- a/ch2-cgo/ch2-04-memory.md +++ b/ch2-cgo/ch2-07-memory.md @@ -1,4 +1,4 @@ -# 2.4. CGO内存模型 +# 2.7. CGO内存模型 CGO是架接Go语言和C语言的桥梁,它使二者在二进制接口层面实现了互通,但是我们要注意因两种语言的内存模型的差异而可能引起的问题。如果在CGO处理的跨语言函数调用时涉及到了指针的传递,则可能会出现Go语言和C语言共享某一段内存的场景。我们知道C语言的内存在分配之后就是稳定的,但是Go语言因为函数栈的动态伸缩可能导致栈中内存地址的移动(这是Go和C内存模型的最大差异)。如果C语言持有的是移动之前的Go指针,那么以旧指针访问Go对象时会导致程序崩溃。 diff --git a/ch2-cgo/ch2-05-class.md b/ch2-cgo/ch2-08-class.md similarity index 99% rename from ch2-cgo/ch2-05-class.md rename to ch2-cgo/ch2-08-class.md index 4ceb831..499baca 100644 --- a/ch2-cgo/ch2-05-class.md +++ b/ch2-cgo/ch2-08-class.md @@ -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++的引用参数等特性的。 diff --git a/ch2-cgo/ch2-06-static-shared-lib.md b/ch2-cgo/ch2-09-static-shared-lib.md similarity index 99% rename from ch2-cgo/ch2-06-static-shared-lib.md rename to ch2-cgo/ch2-09-static-shared-lib.md index 4623f5f..12c53b4 100644 --- a/ch2-cgo/ch2-06-static-shared-lib.md +++ b/ch2-cgo/ch2-09-static-shared-lib.md @@ -1,4 +1,4 @@ -# 2.6. 静态库和动态库 +# 2.9. 静态库和动态库 CGO在使用C/C++资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在`import "C"`之前的注释部分包含C代码,或者在当前包中包含C/C++源文件。链接静态库和动态库的方式比较类似,都是通过在LDFLAGS选项指定要链接的库方式链接。本节我们主要关注在CGO中如何使用静态库和动态库相关的问题。 diff --git a/ch2-cgo/ch2-07-py-module.md b/ch2-cgo/ch2-10-py-module.md similarity index 99% rename from ch2-cgo/ch2-07-py-module.md rename to ch2-cgo/ch2-10-py-module.md index 1b1b55c..bcdeb0c 100644 --- a/ch2-cgo/ch2-07-py-module.md +++ b/ch2-cgo/ch2-10-py-module.md @@ -1,4 +1,4 @@ -# 2.7 Go实现Python模块 +# 2.10 Go实现Python模块 前面章节我们已经讲述了如何通过CGO来引用和创建C动态库和静态库。实现了对C动态库和静态库的支持,理论上就可以应用到动态库的绝大部分场景。Python语言作为当下最红的语言,本节我们将演示如何通过Go语言来为Python脚本语言编写扩展模块。 diff --git a/ch2-cgo/ch2-11-link.md b/ch2-cgo/ch2-11-link.md new file mode 100644 index 0000000..3fb4c51 --- /dev/null +++ b/ch2-cgo/ch2-11-link.md @@ -0,0 +1 @@ +# 2.11. 编译和链接参数 diff --git a/ch2-cgo/ch2-08-faq.md b/ch2-cgo/ch2-12-faq.md similarity index 98% rename from ch2-cgo/ch2-08-faq.md rename to ch2-cgo/ch2-12-faq.md index 5f26326..09b885b 100644 --- a/ch2-cgo/ch2-08-faq.md +++ b/ch2-cgo/ch2-12-faq.md @@ -1,4 +1,4 @@ -# 2.8. 补充说明 +# 2.12. 补充说明 为何要话费巨大的精力学习CGO是一个问题。任何技术和语言都有它自身的优点和不足,Go语言不是银弹,它无法解决全部问题。而通过CGO可以继承C/C++将近半个世纪的软件遗产,通过CGO可以用Go给其它系统写C接口的共享库,通过CGO技术可以让Go语言编写的代码可以很好地融入现有的软件生态——而现在的软件正式建立在C/C++语言之上的。因此说CGO是一个保底的后备技术,它是Go的一个重量级的替补技术,值得任何一个严肃的Go语言开发人员学习。