Go语言入手(一) | 青训营笔记

156 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

Go语言的特点

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

基础数据类型

Go语言将数据类型分为4类:基础类型、复合类型、引用类型、接口类型。

基础类型:数字、字符串、布尔型。

复合类型:数组、结构体。

引用类型:指针、切片、字典、函数、通道。

💡 引用意味着对任一引用类型数据的修改都会影响所有该引用的拷贝。

整型

  1. 整型有int int8 int16 int32 int 64 四种截然不同大小的整数类型。
  2. 与之对应的有unit uint8 uint16 uint32 uint64无符号类型。
  3. rune类型和int32类型等价。这两个名称可以互换使用。
  4. byte类型和unit32等价。byte类型一般用于强调数值是一个原始的数据,而不是一个小的整数。
  5. uintptr是无符号整型。没有指定具体的大小,但是足以容纳指针。这种类型只有在底层编程中才会用到,特别是Go语言与C语言函数库或操作系统接口相交互的地方。
  6. 整型、无符号整型、指针整型是不同类型的兄弟类型。就算大小相同,也要进行显式的类型转换操作。

Go语言的取模操作

Go语言中取模操作很特别,%取模运算符的符号和被取模数的符号总是一致的,因此-5%3-5%-3 的结果都是-2.

Go语言的无符号数

Go语言的无符号数应该慎用,往往在只有在位运算或者其他特殊的运算场景才会使用,比如bit集合,分析二进制文件格式或者是哈希和加密操作等。

浮点数

Go语言提供了两种精度的浮点数,float32float64

32精度的浮点数可以提供大约6个十进制数的精度,而64精度的浮点数可以提供约15个十进制数的精度。

通常应该使用64精度,因为32精度的累计计算误差很容易扩散。

复数

Go语言提供了两种精度的复数类型:complete64complete128 分别对应float32float64 两种浮点数精度。

var x complete128 = complete(1, 2) //1 + 2i
fmt.Println(real(x)) //"1"
fmt.Println(imag(x)) //"2"

可以直接在浮点数或整数后面加上i,作为Go语言中的复数。如:

x := 1 + 2i
y := 3 + 4i

布尔型

布尔值不能隐式转换为数字值0或1。用一个if语句显式转换。

字符串

文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。

字符串不可更改性使得复制、切片的操作变得廉价。

标准库中与字符串处理相关的包

  1. strings

    包中提供乐许多如字符串查询、替换、比较、截断、拆分、合并等功能。

  2. bytes

    提供了类似strings功能的函数,但针对的是和字符串有相似结构的[]byte类型。因为字符串是只读的,因此逐步构建字符串会导致很多分配和赋值。在这种情况下,使用bytes.Buffer类型将会更有效。

    使用bytes.Buffer 添加任意字符时,最好使用bytes.BufferWriteRune方法,但是WriteByte方法对于写入类似[ ]等ASCII字符会更有效。

  3. strconv

    提供了布尔型、整型、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。

  4. unicode

    提供了IsDigit、IsLetter、IsUpper、IsLower等类似功能,用于给字符分类。

    提供了ToUpper、ToLower的转换函数。(strings中也有,针对整个字符串)

将一个整数转为字符串的方法

  1. 使用fmt.Sprintf返回一个格式化的字符串。

    x := 123
    y := fmt.Sprinf("%d", x)
    fmt.Println(y)
    
  2. 使用strconv.Itoa(整数到ASCII码)

    x := 123
    fmt.Println(strconv.Itoa(x))
    

将一个字符串转为整数的方法

  1. 使用strconv.Atoi

  2. 使用strconv.ParseInt

    x, err := strconv.Atoi("123")
    y, err := strconv.ParseInt("123", 10, 64) 
    //第二个参数是进制,第三个参数是整型的大小,16是int16,,0是int
    
  3. 直接使用fmt.Scanf解析输入的字符串和数字,特别是当字符串和数字混合在一起的时候,它可以灵活处理不完整或不规则的输入。

Unicode

Unicode收集了世界上所有的符号系统,包括重音符号和其他一些符号。每个符号分配一个唯一的Unicode码点,Unicode码点对应Go语言中的rune整数类型。(rune是int32等价类型)

UTF-8

将Unicode码点编码成字节序列的变长编码。

常量

常量表达式在编译期计算,而不是运行期。

itoa常量生成器

在一个const声明语句中,在第一个声明的常量所在的行,itoa被置为0,然后在每一个有常量声明的行加1.

无类型常量

编译器为没有明确基础类型的数字常量提供比基础常量更高精度的算数运算。