From 0b37329ef91b6c01840e7ce7ed5bf6d1bb1cd722 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Sun, 18 Feb 2018 04:11:09 +0800 Subject: [PATCH] =?UTF-8?q?ch2-2:=20=E5=AE=8C=E5=96=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E5=86=85=E5=AD=98,=20=E5=A2=9E=E5=8A=A0Go1.10?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E6=9B=B4=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch2-cgo/ch2-02-cgo-types.md | 17 ++++++++++++++++- examples/ch2-01/hello-06/main.go | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ch2-cgo/ch2-02-cgo-types.md b/ch2-cgo/ch2-02-cgo-types.md index 9962e35..84dfc2b 100644 --- a/ch2-cgo/ch2-02-cgo-types.md +++ b/ch2-cgo/ch2-02-cgo-types.md @@ -90,7 +90,22 @@ extern void helloString(GoString p0); extern void helloSlice(GoSlice p0); ``` -不过需要注意的是,如果使用了GoString类型则会对`_cgo_export.h`头文件产生依赖,而这个头文件是动态输出的。更严谨的做法是为C语言函数接口定义严格的头文件,然后基于稳定的头文件实现代码。 +不过需要注意的是,如果使用了GoString类型则会对`_cgo_export.h`头文件产生依赖,而这个头文件是动态输出的。 + +Go1.10针对Go字符串增加了一个`_GoString_`预定义类型,可以降低在cgo代码中可能对`_cgo_export.h`头文件产生的循环依赖的风险。我们可以调整helloString函数的C语言声明为: + +```c +extern void helloString(_GoString_ p0); +``` + +因为`_GoString_`是预定义类型,我们无法通过此类型直接访问字符串的长度和指针等信息。Go1.10同时也增加了以下两个函数用于获取字符串结构中的长度和指针信息: + +```c +size_t _GoStringLen(_GoString_ s); +const char *_GoStringPtr(_GoString_ s); +``` + +更严谨的做法是为C语言函数接口定义严格的头文件,然后基于稳定的头文件实现代码。 ## 结构体、联合、枚举类型 diff --git a/examples/ch2-01/hello-06/main.go b/examples/ch2-01/hello-06/main.go index 015d460..0f0f8f8 100644 --- a/examples/ch2-01/hello-06/main.go +++ b/examples/ch2-01/hello-06/main.go @@ -19,5 +19,6 @@ func main() { //export SayHello func SayHello(s string) { + fmt.Println(int(C._GoStringLen(s))) fmt.Print(s) }