Go入门-Go语言圣经学习 | 青训营笔记

80 阅读4分钟

这是我参与「第五届青训营」笔记创作活动的第4天。

学习内容

今天没有青训营课程,回顾了前几天的课程,学习Go语言圣经扎实基础,查漏补缺。

go的指针补充

一个变量对应一个保存了变量对应类型值的内存空间。一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。

声明一个指针:

  1. 如果用“var x int”声明语句声明一个x变量,那么&x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针,指针对应的数据类型是*int,指针被称之为“指向int类型的指针”。如果指针名字为p,那么可以说“p指针指向变量x”,或者说“p指针保存了x变量的内存地址”。同时*p表达式对应p指针指向的变量的值。
var x int = 0
p := &x (var p *int = &x)
  1. 使用new函数创建的匿名变量返回一个指针,每次调用new函数都是返回一个新的变量的地址。
p := new(int)

其中,*p = 0,指针p对应的数据类型是*int

基础数据结构补充

  1. 整型:Go语言提供了有符号和无符号类型的整数运算。有int8、int16、int32和int64四种截然不同大小的有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。
    还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit。
    Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可以互换使用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。
    还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
    有符号整数采用2的补码形式表示,也就是最高bit位用来表示符号位一个n-bit的有符号数的值域是从2n1-2^{n-1}2n112^{n-1}-1。无符号整数的所有bit位都用于表示非负数,值域是0到2n12^n-1
    int和int32也是不同的类型,即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作,反之亦然。
  2. 浮点数:Go语言提供了两种精度的浮点数,float32和float64。一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度;通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)
  3. 复数:Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:
    var x complex128 = complex(1, 2) // 1+2i
    在常量算术规则下,一个复数常量可以加到另一个普通数值常量(整数或浮点数、实部或虚部),我们可以用自然的方式书写复数,就像1+2i或与之等价的写法2i+1。上面x和y的声明语句还可以简化:
    x := 1 + 2i
    复数也可以用==和!=进行相等比较。只有两个复数的实部和虚部都相等的时候它们才是相等的。
  4. 布尔型:一个布尔类型的值只有两种:true和false。
  5. 字符串:字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。
    因为字符串是不可修改的,因此尝试修改字符串内部数据的操作也是被禁止的。