Go学习笔记(三)
1.值类型和引用类型
值类型:基本数据类型int系列,float系列,bool,string,数组和结构体struct。
引用类型:指针。slice切片,map,管道chan,interface等
值类型的特点:变量直接存储值,内存通常在栈中分配
引用类型:变量储存是一个地址,这个地址对应的空间才是真正的存储数据,内存通常在堆上分配。
2.字符串
字符串是不可变的字节序列。习惯上,文本字符串被解读成按UTF-8编码的codepoint码点。
内置的len函数返回字符串的字节数(并非文字符号的数目)。
子串生成操作s[i:j]产生一个新字符串,加号(+)运算符连接两个字符串而生成一个新字符串。
试图访问许可范围以外的字节,会触发宕机异常。
字符串字面量:使用“”,而原生的,则用反引号··,其中转义字符不起作用。
utf8.RuneCountInString, utf8.DecodeRuneInString
若遇到不合理字节,无论是显示调用utf8.DecodeRuneInString还是range循环,都会产生一个专门的Unicode字符‘\uFFFD’替换它,其输出通常是个黑色六角形,里面有个白色问号。
bytes,strings,strconv,unicode包对字符串操作很重要。
3.原码,反码,补码
- 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
- 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
- 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.