@@ -983,4 +983,104 @@ ch := make(chan int, 5) // 创建一个容量为 5 的有缓冲 channel
983983 result := <- resultCh // 接收异步操作的结果
984984 ```
985985
986- 这些场景只是使用无缓冲和有缓冲 channel 的一部分示例。根据具体的需求,合理选择适当类型的 channel 可以提高程序的效率和可维护性,同时确保并发操作的正确性。
986+ 这些场景只是使用无缓冲和有缓冲 channel 的一部分示例。根据具体的需求,合理选择适当类型的 channel 可以提高程序的效率和可维护性,同时确保并发操作的正确性。
987+
988+ ## 1.9. cgo-Go调用C代码
989+
990+ 在 Go 语言中,CGO 是 Go 语言提供的一种特性,用于在 Go 代码中调用 C 语言代码。通过 CGO,可以很方便地在 Go 代码中集成现有的 C 代码库,或者利用 C 语言的性能优势来编写高性能的代码片段。
991+
992+ 使用 CGO 的一般流程包括以下步骤:
993+
994+ 1 . ** 编写 C 代码** :首先需要编写需要调用的 C 代码,可以是一个简单的 C 函数或者一个 C 语言库。
995+ 2 . ** 创建 C 头文件** :为了在 Go 代码中调用 C 函数,需要创建一个 C 头文件,用于声明 C 函数的原型。
996+ 3 . ** 在 Go 代码中使用 CGO** :在 Go 代码中通过 ` import "C" ` 来引入 CGO,然后通过 ` // #cgo ` 指令告诉编译器去链接 C 代码。
997+ 4 . ** 调用 C 函数** :在 Go 代码中就可以像调用普通 Go 函数一样调用 C 函数,通过 CGO 技术实现 Go 与 C 语言的互操作。
998+
999+ 以下是一个更详细的示例,展示如何使用 CGO 在 Go 中调用一个简单的 C 函数来实现字符串加密和解密功能。
1000+
1001+ ** 1. 编写 C 代码**
1002+
1003+ 首先,我们编写两个简单的 C 函数,一个用于加密字符串,另一个用于解密字符串。
1004+
1005+ ``` c
1006+ // encrypt.c
1007+ #include < stdio.h>
1008+
1009+ void encrypt (char* str) {
1010+ while (* str) {
1011+ * str = * str ^ 31;
1012+ str++;
1013+ }
1014+ }
1015+
1016+ // decrypt.c
1017+ #include <stdio.h>
1018+
1019+ void decrypt(char* str) {
1020+ while (* str) {
1021+ * str = * str ^ 31;
1022+ str++;
1023+ }
1024+ }
1025+ ```
1026+
1027+ **2. 创建 C 头文件 `crypto.h`**
1028+
1029+ 创建一个头文件 `crypto.h`,用于声明 C 函数的原型。
1030+
1031+ ```c
1032+ // crypto.h
1033+ void encrypt(char* str);
1034+ void decrypt(char* str);
1035+ ```
1036+
1037+ ** 3. 编写 Go 代码**
1038+
1039+ 接下来,我们编写 Go 代码,通过 CGO 调用上述的 C 函数来加密和解密字符串。
1040+
1041+ ``` go
1042+ package main
1043+
1044+ /*
1045+ #cgo CFLAGS: -g -Wall
1046+ #cgo LDFLAGS: -lm
1047+ #include "crypto.h"
1048+ */
1049+ import " C"
1050+ import " fmt"
1051+
1052+ func main () {
1053+ message := " Hello, world!"
1054+
1055+ // Encrypt the message
1056+ cMessage := C.CString (message)
1057+ defer C.free (unsafe.Pointer (cMessage))
1058+ C.encrypt (cMessage)
1059+ fmt.Printf (" Encrypted message: %s \n " , C.GoString (cMessage))
1060+
1061+ // Decrypt the message
1062+ C.decrypt (cMessage)
1063+ fmt.Printf (" Decrypted message: %s \n " , C.GoString (cMessage))
1064+ }
1065+ ```
1066+
1067+ 在这个示例中,Go 代码通过 ` import "C" ` 引入 CGO,然后使用 ` // #cgo ` 指令来指定编译选项。在 ` main ` 函数中,我们首先将 Go 字符串转换为 C 字符串,然后调用 C 函数来加密和解密字符串,最后将结果打印出来。
1068+
1069+ ** 4. 构建和运行程序**
1070+
1071+ 在包含以上文件的目录中,可以通过以下命令构建和运行这个示例程序:
1072+
1073+ ``` bash
1074+ go build -o crypto
1075+ ./crypto
1076+ ```
1077+
1078+ 程序应该输出以下内容:
1079+
1080+ ```
1081+ Encrypted message: LQYYX;#rNXVX
1082+ Decrypted message: Hello, world!
1083+ ```
1084+
1085+
1086+
0 commit comments