1
0
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:
chai2010 2018-04-23 13:21:15 +08:00
parent 5787cf8467
commit 85ef6e6a36
13 changed files with 24 additions and 16 deletions

View File

@ -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)

View File

@ -1,4 +1,4 @@
# 2.1. 你好, CGO! # 2.1. 快速入门
在第一章的“Hello, World 的革命”一节中我们已经见过一个CGO程序。这一节我们将重新给出三个版本的CGO实现来简单展示CGO的用法。 在第一章的“Hello, World 的革命”一节中我们已经见过一个CGO程序。这一节我们将重新给出三个版本的CGO实现来简单展示CGO的用法。

View File

@ -1,4 +1,4 @@
# 2.3. CGO编程基础 # 2.2. CGO编程基础
Go是一门以实用为主要目的的编程语言我们可以通过cgo来直接调用C语言代码也可以在C语言代码中直接调用Go函数。要使用CGO特性需要安装CC++构建工具链在macOS和Linux下是要安装和GCC在windows下是需要安装MinGW工具。同时需要保证环境变量`CGO_ENABLED`被设置为1这表示CGO是被启用的状态。在本地构建时`CGO_ENABLED`默认是启用的当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序需要手工设置好C/C++交叉构建的工具链,同时开启`CGO_ENABLED`环境变量。 Go是一门以实用为主要目的的编程语言我们可以通过cgo来直接调用C语言代码也可以在C语言代码中直接调用Go函数。要使用CGO特性需要安装CC++构建工具链在macOS和Linux下是要安装和GCC在windows下是需要安装MinGW工具。同时需要保证环境变量`CGO_ENABLED`被设置为1这表示CGO是被启用的状态。在本地构建时`CGO_ENABLED`默认是启用的当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序需要手工设置好C/C++交叉构建的工具链,同时开启`CGO_ENABLED`环境变量。

View File

@ -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
View File

@ -0,0 +1 @@
# 2.4. 函数调用

View File

@ -0,0 +1 @@
# 2.5. 内部机制

1
ch2-cgo/ch2-06-qsort.md Normal file
View File

@ -0,0 +1 @@
# 2.6. 实战: 封装qsort

View File

@ -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对象时会导致程序崩溃。

View File

@ -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++的引用参数等特性的。

View File

@ -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中如何使用静态库和动态库相关的问题。

View File

@ -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
View File

@ -0,0 +1 @@
# 2.11. 编译和链接参数

View File

@ -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语言开发人员学习。