如何在Go中使用数据类型
Go是一种静态类型的编程语言,这意味着Go中的每个值都有特定的类型,这些类型在编译时必须知道,以便编译器能够确保程序以安全的方式处理这些值。本文将考虑你需要了解的语言中最重要的内置类型。
数据类型指定一个值代表什么,以及为该值分配多少内存。在许多情况下,你不需要明确地指定数据类型,例如在声明变量时。它可以根据右手边的表达式来推断。在Go中也可以进行类型间的转换。例如,一个float64 的值可以转换为int ,反之亦然。
在本教程中,我们将看看Go中的基本类型,它们是语言中所有其他类型的基础,包括用户创建的类型。对数据类型的调查并不详尽,但它将帮助你更熟悉语言中的类型如何工作。我们还将考虑Go中的基本数字运算和类型转换。
整数类型
整数是一个没有小数部分的数字,它可以是有符号或无符号的。有符号的整数可以是正数或负数,而无符号的整数总是正数。Go为这两种类型的整数提供了四种不同的大小,可以在下表中看到。

除此以外,Go还提供了另外两种类型,简单地称为int 和uint ,其大小可能是32或64位,取决于程序运行的计算机的CPU架构。也就是说,int 或uint 在32位计算机上是32位,在64位计算机上是64位。
int 是语言中最常用的整数类型,在处理整数时应该选择它,除非你有特殊的原因要使用其他类型。如果你声明一个整数变量而没有明确注释其类型,那么它将是 。int
var number = 5
fmt.Printf("The type of number is: %T", number) // The type of number is int
符文
Go没有特定的字符类型(例如其他语言中的char ),所以它使用rune 类型来表示Unicode字符值。rune 类型是int32 类型的别名,在所有方面都是等同的。
符文用单引号表示,每一个符文都映射到一个数字(其Unicode编码点),这就是实际被存储的内容。例如,符文字面 "A "对应于数字65。符文可以用于任何语言中的任何类型的字符,而不仅仅是 ASCII字符。日文、中文和韩文字符,重音字母,甚至表情符号,都是围棋中有效的符文值。
var char = 'न' // a rune literal
fmt.Printf("char is %d and its type is %T\n", char, char) // char is 2344 and its type is int32
fmt.Println(char == 2344) // true
字节
与rune 类型类似,byte 也是一个整数类型的别名。在这种情况下,它是uint8 。byte 类型用来表示一个值是一个原始数据,而不是一个小数字,它必须明确注释,不像rune 。
var char byte = 'a'
fmt.Printf("char is %d, and its type is %T\n", char, char) // char is 97, and its type is uint8
字符串
在Go中,字符串是一个不可改变的字节序列。你可以用双引号,或反引号(也称为后引号)来表示一个字符串,如下图所示。
str := "I am a string"
str2 := `I am also a string`
fmt.Println(str, str2)
字符串的不可变性意味着构成字符串的字节序列不能被改变。
str := "I"
str[0] = "A" // cannot assign to str[0]
当然,你可以把一个字符串分配给你想要的许多变量,甚至在这样做的时候追加到它。正如下面所观察到的那样,串联一个字符串并不改变原来的字符串。
s1 := "Hi"
s2 := "Ayo"
s3 := s1 + " " + s2
fmt.Println(s1) // Hi
fmt.Println(s2) // Ayo
fmt.Println(s3) // Hi Ayo
双引号的字符串和用回车符括起来的字符串的区别是,前者不支持换行,但可以包含转义字符,例如\n 和\t 。
str := "Hello\nWorld" // \n is replaced with a newline
fmt.Println(str)
输出
Hello
World
另一方面,用反斜线括起来的字符串被称为原始字符串字面。它们完全按照写法显示,不支持转义字符。它们经常被用来构建跨越多行的字符串。
str := `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<script></script>
</body>
</html>.`
fmt.Println(str)
输出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<script></script>
</body>
</html>
浮点类型
Go有两种用于浮点数(十进制数)的原始类型。它们是float32 和float64 ,大小分别为32位和64位。如果没有指定,浮点数的默认类型是float64 。
f1 := 3.14
fmt.Printf("Value: %g, Type: %T\n", f1, f1) // Value: 3.14, Type: float64
var f2 float32 = -0.45
fmt.Printf("Value: %g, Type: %T\n", f2, f2) // Value: -0.45, Type: float32
在大多数情况下,应该首选float64 ,因为它的精度比float32 要好得多。
布尔类
像大多数语言一样,Go中有两种布尔类型:true 和false 。布尔类型可以在必要时使用bool 进行注释。
t := true
var f bool = false
fmt.Println(t, f) // true false
在使用比较运算符时也会产生布尔值,如:==,>,<,>=,!=,&&,|| 等。
b1 := true && false
b2 := 10 > 20
b3 := "Hello" == "Hello"
fmt.Println(b1, b2, b3) // false false true
数值操作
Go中完全支持所有基本的数字运算,如加法、减法、乘法、除法等,它们适用于所有数字类型。
r1 := 1 + 2
r2 := 5.4 - 1.2
r3 := 6 / 2
r4 := -0.45 * 2.34
fmt.Println(r1, r2, r3, r4) // 3 4.2 3 -1.053
我们还有增量 (++) 和减量 (—) 操作符、位操作符 (&,|,^,<<,>>) 、赋值操作符 (+=,-=,*=,/=, e.t.c.) 等等。
a := 5
b := 5
a++ // 6
b-- // 4
c := 4 ^ 5 // 1
var d int
d += c // 1
类型转换
与其他一些语言不同,Go不允许在对不同类型的值进行操作时进行隐式类型转换。
a := 1
b := 1.5
r := a + b // invalid operation: a + b (mismatched types int and float64)
解决方案是使用T(v) 语法在两种数字类型之间进行转换。
a := 1
b := 1.5
r := float64(a) + b // 2.5
结论
在这篇文章中,我们讨论了你在Go中主要会用到的重要数据类型,如何执行一些操作以及你需要注意的基本类型转换。我们在这里没有涉及复合类型(数组、分片、结构)和用户定义类型,但我们会在本系列的后续文章中涉及。