1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00

Merge pull request #158 from fuwensun/pr3-5-7

ch3-05-fix typo
This commit is contained in:
chai2010 2018-06-29 19:46:54 +08:00 committed by GitHub
commit 7cbe19c04b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -177,7 +177,7 @@ Go语言作为一门静态编译型语言在执行时每个函数的地址都
GO_RESULTS_INITIALIZED记录的也是PC表格的信息表示PC指针越过某个地址之后返回值才完成被初始化的状态。
Go语言二进制文件中除了有PC表格还有FUNC表格用于记录函数的参数、局部变量的指针信息。FUNCDATA指令和PCDATA的格式类似`FUNCDATA tableid, tableoffset`第一个参数为表格的类型第二个是表格的地址。目前的实现中定义了三种FUNC表格类型FUNCDATA_ArgsPointerMaps表示函数参数的指针信息表FUNCDATA_LocalsPointerMaps表示局部指针信息表FUNCDATA_InlTree表示被内联展开的指针信息表。通过FUNC表格Go语言的垃圾回收器可以跟踪全部指针的生命周期同时根据指针指向的地址是否被移动的栈范围来确定是否要进行指针移动。
Go语言二进制文件中除了有PC表格还有FUNC表格用于记录函数的参数、局部变量的指针信息。FUNCDATA指令和PCDATA的格式类似`FUNCDATA tableid, tableoffset`第一个参数为表格的类型第二个是表格的地址。目前的实现中定义了三种FUNC表格类型FUNCDATA_ArgsPointerMaps表示函数参数的指针信息表FUNCDATA_LocalsPointerMaps表示局部指针信息表FUNCDATA_InlTree表示被内联展开的指针信息表。通过FUNC表格Go语言的垃圾回收器可以跟踪全部指针的生命周期同时根据指针指向的地址是否被移动的栈范围来确定是否要进行指针移动。
在前面递归函数的例子中我们遇到一个NO_LOCAL_POINTERS宏。它的定义如下
@ -193,7 +193,7 @@ Go语言二进制文件中除了有PC表格还有FUNC表格用于记录函数
PCDATA和FUNCDATA的数据一般是由编译器自动生成的手工编写并不现实。如果函数已经有Go语言声明那么编译器可以自动输出参数和返回值的指针表格。同时所有的函数调用一般是对应CALL指令编译器也是可以辅助生成PCDATA表格的。编译器唯一无法自动生成是函数局部变量的表格因此我们一般要在汇编函数的局部变量中谨慎使用指针类型。
对于PCDATA和FUNCDATA细节兴趣的同学可以尝试从debug/gosym包入手参考包的实现和测试代码。
对于PCDATA和FUNCDATA细节兴趣的同学可以尝试从debug/gosym包入手参考包的实现和测试代码。
## 方法函数
@ -225,7 +225,7 @@ TEXT ·MyInt·Twice(SB), NOSPLIT, $0-16
RET
```
不过这只是最多非指针类型的解释函数。现在增加一个接收参数是指针类型的Ptr方法指针返回传入的指针:
不过这只是接收非指针类型的方法函数。现在增加一个接收参数是指针类型的Ptr方法函数返回传入的指针:
```go
func (p *MyInt) Ptr() *MyInt {