Unit2-类型

1、实数

  • 在Go语言中,所有带小数的数字在默认情况下都会被设置为 float64类型

  • 但如果使用整数去初始化一个变量,那么Go语言只有在显式地指定浮点类型时,才会将其声明为浮点类型变量

    例如:var a float64 = 10

  • Go语言有两种浮点类型,默认float64 又称双精度浮点数,每64位的浮点数需要占用8字节内存;

    另一种是float32 又称单精度浮点数,占用4字节,32位,在使用时需要声明:var a float32 = 1.121

  • 零值:声明一个变量但没有赋值时,该变量会被初始化为零值

  • 格式化打印浮点数:

    printf使用格式化变量%f来指定显示小数点后几位:%.3f(显示小数点后保留3位)

为了尽量最小化舍入错误,在浮点类型数值计算时,建议先做乘法,再做除法

2、整数

整数类型包括有符号和无符号两种:

  • 有符号:能表示正数、0、负数。典型的有符号整数int类型
  • 无符号:能表示正数、0。典型的无符号整数uint类型

Printf里使用%T可以打印数据的类型。

2.1、 Uint8

  • Uint8可以用来表示8位的颜色(红绿蓝:0~255)

Printf里使用%x%X在打印十六进制数字时,可以格式化变量。

Printf里使用%b在打印二进制数字时,可以格式化变量。

2.2、整数环绕

所有整数类型都有一个取值范围,超出这个范围就会发生“环绕”:

image-20240326171857473

3、多语言文本

3.1、声明字符串变量

Go语言会把双引号包围的字面值推断为string类型,一下三条语句的作用相同:

1
2
3
a := "hi"
var a = "hi"
var a string = "hi"
  • 使用反引号( ` )包围文本的字符串称为原始字符串字面量,比如可以把转义字符本身进行输出

    1
    2
    fmt.Println("abc \n def")	// 输出时abc与def中间会换行
    fmt.Println(`abc \n def`) // 输出:abc \n def 打印转义符 \n 本身
  • 使用反引号可以进行跨多个文本行

    1
    2
    3
    fmt.Println(`abc
    def
    ghf`)

3.2、字符、代码点、符文和字节

  • 代码点:Code point;例如:65代表A,128515代表笑脸。为了表示这样的代码点,Go语言提供了rune这个类型,它是int32的一个类别名

  • byte是uint8类型的别名,目的是用于二进制数据,byte可以表示由ASCII定义的英语字符

  • 类别别名:就是同一个类型的另一个名字,语法如下

    1
    2
    type byte = uint8
    type rune = int32

如果想打印字符而不是数值,则使用%c来格式化

  • 字符字面值使用 ‘ ‘括起来,例如:’A’,如果没有指定字符类型,Go会推断它的类型为rune

  • 小写字符与大写字符转换:

    1
    2
    c := 'd'
    c = c - 'a'+'A' //输出 'D'
  • Go中的字符串是用UTF-8编码的,len内置函数时以字节为单位返回字符串长度,而UTF-8中提供了一个函数RuneCountInString可以用符文为单位来返回字符串长度。

4、类型转换

4.1、类型不能混着用

  • 连接两个字符串,使用+运算符:a := "abc" + "def"
  • 如果连接字符串和数值,则会报错:a := "abc" + 10 + "def"
  • 整型和浮点类型也不能混着用

4.2、数值类型之间的转换

  • 整数转换成浮点类型:

    1
    2
    age := 40
    marsAge := float64(64)
  • 浮点类型转换成整数,小数点后面的部分会被截断,而不是舍入

  • 有符号整数和无符号整数之间以及各种不同长度的类型之间都需要进行类型转换,例如:int8转换成int32

4.3、字符串转换

  • 想把rune、byte转换为string,语法是:

    1
    2
    3
    var pi rune = 960
    var bang byte = 33
    fmt.Print(string(pi),string(bang))
  • 如果想把数值转化成string,首先它的值必须能转化为code point;然后使用strconv包的Itoa函数可以完成转换。

    Itoa是Integer to ASCII的意思

    1
    str := "str" + strconv.Itoa(10) + "abc"	//输出 str10abc 
  • 另一种数值转换string的方式是使用Sprintf函数

    1
    2
    3
    countdown := 9
    strs := fmt.Sprintf("abd is %v def", countdown)
    fmt.Println(strs) //输出 abd is 9 def
  • 若想把字符串转换成数值,可以使用strconv中的Atoi函数

  • Go是静态类语言,一旦某个变量被声明,那么它的类型就无法再改变

  • strings包中strings.Replace函数可以移除消息中的空格;strings.ToUpper函数可以将字母转换为大写字母

单元测试:写一个维吉尼亚解密程序,解密下面的加密文字

加密文本:cipherText := “CSOITEUIWUIZNSROCNKFD”

加密关键字:keyword := “GOLANG”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 程序
package main
import "fmt"

func main() {
cipherText := "CSOITEUIWUIZNSROCNKFD"
keyword := "GOLANG"
message := ""
keyIndex := 0

for i := 0; i < len(cipherText); i++ {
c := cipherText[i] - 'A'
k := keyword[keyIndex] - 'A'

//加密字母-关键字字母
c = (c-k+26)%26 + 'A'
message += string(c)
keyIndex++
keyIndex %= len(keyword) //当keyIndex达到keyword长度时,返回至0开始计数
}
fmt.Println(message)
}