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 #209 from plpan/master

ch3-06 修复拼写错误
This commit is contained in:
Xargin 2018-07-23 00:00:46 +08:00 committed by GitHub
commit c9f00ebf81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 3 additions and 3 deletions

View File

@ -192,7 +192,7 @@ func MyInt_Twice(v MyInt) int {
// func (v MyInt) Twice() int
TEXT ·MyInt·Twice(SB), NOSPLIT, $0-16
MOVQ a+0(FP), AX // v
MOVQ AX, AX // AX *= 2
ADDQ AX, AX // AX *= 2
MOVQ AX, ret+8(FP) // return v
RET
```

View File

@ -167,7 +167,7 @@ var g_goid_offset = func() int64 {
枚举和暴力穷举虽然够直接但是对于正在开发中的未发布的Go版本支持并不好我们无法提前知晓开发中的某个版本的goid成员的偏移量。
如果是在runtime包内部我们可以通过`unsafe.OffsetOf(g.gois)`直接获取成员的偏移量。也可以通过反射获取g结构体的类型然后通过类型查询某个成员的偏移量。因为g结构体是一个内部类型Go代码无法从外部包获取g结构体的类型信息。但是Go汇编语言中我们是可以看到全部的符号的因此理论上我们也可以获取g结构体的类型信息。
如果是在runtime包内部我们可以通过`unsafe.OffsetOf(g.goid)`直接获取成员的偏移量。也可以通过反射获取g结构体的类型然后通过类型查询某个成员的偏移量。因为g结构体是一个内部类型Go代码无法从外部包获取g结构体的类型信息。但是Go汇编语言中我们是可以看到全部的符号的因此理论上我们也可以获取g结构体的类型信息。
在任意的类型被定义之后Go语言都会为该类型生成对应的类型信息。比如g结构体会生成一个`type·runtime·g`标识符表示g结构体的值类型信息同时还有一个`type·*runtime·g`标识符表示指针类型的信息。如果g结构体带有方法那么同时还会生成`go.itab.runtime.g``go.itab.*runtime.g`类型信息,用于表示带方法的类型信息。
@ -194,7 +194,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了