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

Merge pull request #161 from fuwensun/pr3-7-1

ch3-07-fix typo
This commit is contained in:
chai2010 2018-07-02 06:02:39 +08:00 committed by GitHub
commit ca1ed4da49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,7 +4,7 @@
## 故意设计没有goid
根据官方的相关资料显示Go语言刻意没有提供goid的原因是为了避免被滥用。因为大部分用户在轻松拿到goid之后在之后的编程中会不自觉地编写出强依赖goid的代码。强依赖goid将导致这些代码不好移植同时也会导致并发模型复杂化。同时Go语言中可能同时存在海量的Goroutine但是每个Goroutine合适被销毁并不好实时监控这也会导致依赖goid的资源无法很好地自动回收需要手工回收。如果你是Go汇编语言用户完全可以忽略这些借口。
根据官方的相关资料显示Go语言刻意没有提供goid的原因是为了避免被滥用。因为大部分用户在轻松拿到goid之后在之后的编程中会不自觉地编写出强依赖goid的代码。强依赖goid将导致这些代码不好移植同时也会导致并发模型复杂化。同时Go语言中可能同时存在海量的Goroutine但是每个Goroutine何时被销毁并不好实时监控这也会导致依赖goid的资源无法很好地自动回收需要手工回收。如果你是Go汇编语言用户完全可以忽略这些借口。
## 纯Go方式获取goid
@ -191,7 +191,7 @@ TEXT ·getg(SB), NOSPLIT, $32-16
RET
```
其中AX寄存器对应g指针BX寄存器对应g结构体的类型。然后通过runtime·convT2E函数将类型转为接口。因为我们使用的不是g结构体指针类型因此返回的接口表示的g结构体值类型。理论上我们也可以构造g指针类型的接口但是因为Go汇编语言的限制我们无法`type·*runtime·g`标识符。
其中AX寄存器对应g指针BX寄存器对应g结构体的类型。然后通过runtime·convT2E函数将类型转为接口。因为我们使用的不是g结构体指针类型因此返回的接口表示的g结构体值类型。理论上我们也可以构造g指针类型的接口但是因为Go汇编语言的限制我们无法`type·*runtime·g`标识符。
基于g返回的接口就可以容易获取goid了
@ -264,7 +264,7 @@ TEXT ·getg(SB), NOSPLIT, $32-16
RET
```
其中NO_LOCAL_POINTERS表示函数没有局部指针变量。同时对返回的接口进行零值初始化初始化完成后通过GO_RESULTS_INITIALIZED告知GC。这样可以在保证栈分裂GC能够正确处理返回值和局部变量中的指针。
其中NO_LOCAL_POINTERS表示函数没有局部指针变量。同时对返回的接口进行零值初始化初始化完成后通过GO_RESULTS_INITIALIZED告知GC。这样可以在保证栈分裂GC能够正确处理返回值和局部变量中的指针。
## goid的应用: 局部存储