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 #370 from LaoK996/patch-1

Update ch3-03-const-and-var.md
This commit is contained in:
chai2010 2018-11-02 21:28:29 +08:00 committed by GitHub
commit 34848365ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -82,10 +82,10 @@ DATA ·count+3(SB)/1,$4
// or
DATA ·count+0(SB)/4,$0x01020304
DATA ·count+0(SB)/4,$0x04030201
```
因为X86处理器是小端序因此用十六进制0x01020304初始化全部的4个字节和用1、2、3、4逐个初始化4个字节是一样的效果。
因为X86处理器是小端序因此用十六进制0x04030201初始化全部的4个字节和用1、2、3、4逐个初始化4个字节是一样的效果。
最后还需要在Go语言中声明对应的变量和C语言头文件声明变量的作用类似这样垃圾回收器会根据变量的类型来管理其中的指针相关的内存数据。
@ -196,7 +196,7 @@ GLOBL ·float32Value(SB),$4
DATA ·float32Value+0(SB)/4,$1.5 // var float32Value = 1.5
GLOBL ·float64Value(SB),$8
DATA ·float64Value(SB)/4,$0x01020304 // bit 方式初始化
DATA ·float64Value(SB)/8,$0x01020304 // bit 方式初始化
```
我们在上一节精简的算术指令中都是针对整数如果要通过整数指令处理浮点数的加减法必须根据浮点数的运算规则进行先对齐小数点然后进行整数加减法最后再对结果进行归一化并处理精度舍入问题。不过在目前的主流CPU中都提针对浮点数提供了专有的计算指令。
@ -263,7 +263,7 @@ var helloworld []byte
GLOBL ·helloworld(SB),$24 // var helloworld []byte("Hello World!")
DATA ·helloworld+0(SB)/8,$text<>(SB) // StringHeader.Data
DATA ·helloworld+8(SB)/8,$12 // StringHeader.Len
DATA ·helloworld+16(SB)/8,$16 // StringHeader.Len
DATA ·helloworld+16(SB)/8,$16 // StringHeader.Cap
GLOBL text<>(SB),$16
DATA text<>+0(SB)/8,$"Hello Wo" // ...string data...
@ -344,7 +344,7 @@ GLOBL file_private<>(SB),$1
这样可以减少私有标识符对其它文件内标识符命名的干扰。
此外Go汇编语言还在"textflag.h"文件定义了一些标志。其中用于变量的标志有DUPOK、RODATA和NOPTR几个。DUPOK表示该变量对应的标识符可能有多个在链接时只选择其中一个即可一般用于合并相同的常量字符串减少重复数据占用的空间。RODATA标志表示将变量定义在只读内存段因此后续任何对此变量的修改操作将导致异常panic也无法捕获。NOPTR则表示此变量的内部不含指针数据让垃圾回收器忽略对该变量的扫描。如果变量已经在Go代码中声明过的话Go编译器会自动分析出该变量是否包含指针这种时候可以不用手写NOPTR标志。
此外Go汇编语言还在"textflag.h"文件定义了一些标志。其中用于变量的标志有DUPOK、RODATA和NOPTR几个。DUPOK表示该变量对应的标识符可能有多个在链接时只选择其中一个即可一般用于合并相同的常量字符串减少重复数据占用的空间。RODATA标志表示将变量定义在只读内存段因此后续任何对此变量的修改操作将导致异常recover也无法捕获。NOPTR则表示此变量的内部不含指针数据让垃圾回收器忽略对该变量的扫描。如果变量已经在Go代码中声明过的话Go编译器会自动分析出该变量是否包含指针这种时候可以不用手写NOPTR标志。
比如下面的例子是通过汇编来定义一个只读的int类型的变量
@ -359,9 +359,9 @@ GLOBL ·const_id(SB),NOPTR|RODATA,$8
DATA ·const_id+0(SB)/8,$9527
```
我们使用#include语句包含定义标志的"textflag.h"头文件和C语言中预处理相同。然后GLOBL汇编命令在定义变量时给变量增加了NOPTR和RODATA两个标志多个标志之间采用竖杠分割表示变量中没有指针数据同时定义在只读代码段。
我们使用#include语句包含定义标志的"textflag.h"头文件和C语言中预处理相同。然后GLOBL汇编命令在定义变量时给变量增加了NOPTR和RODATA两个标志多个标志之间采用竖杠分割表示变量中没有指针数据同时定义在只读数据段。
变量一般也叫可取地址的值但是const_id虽然可以取地址但是确实不能修改。不能修改的限制并不是由编译器提供而是因为对该变量的修改会导致对只读内存段进行写导致,从而导致异常。
变量一般也叫可取地址的值但是const_id虽然可以取地址但是确实不能修改。不能修改的限制并不是由编译器提供而是因为对该变量的修改会导致对只读内存段进行写从而导致异常。
## 3.3.5 小结