数据类型
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
Go 语言按类别有以下几种数据类型:
1. 布尔类型 bool
一个简单的例子:var b bool = true。
布尔型的值只可以是常量 true 或者 false。
两个类型相同的值可以使用相等 == 或者不等 != 运算符来进行比较并获得一个布尔型的值。
当相等运算符两边的值是完全相同的值的时候会返回 true,否则返回 false,并且只有在两个的值的类型相同的情况下才可以使用。
示例:
var aVar = 10
aVar == 5 -> false
aVar == 10 -> true
当不等运算符两边的值是不同的时候会返回 true,否则返回 false。
示例:
var aVar = 10
aVar != 5 -> true
aVar != 10 -> false
2. 数字类型
整型 int 和浮点型 float
Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。
Go 也有基于架构的类型,例如:int、uint 和 uintptr。
这些类型的长度都是根据运行程序所在的操作系统类型所决定的:
int和uint在 32 位操作系统上,它们均使用 32 位(4 个字节),在 64 位操作系统上,它们均使用 64 位(8 个字节)。uintptr的长度被设定为足够存放一个指针即可。
Go 语言中没有 float 类型。(Go语言中只有 float32 和 float64)没有 double 类型。
与操作系统架构无关的类型都有固定的大小,并在类型的名称中就可以看出来:
整数:
int8(-128 -> 127)int16(-32768 -> 32767)int32(-2,147,483,648 -> 2,147,483,647)int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
无符号整数:
uint8(0 -> 255)uint16(0 -> 65,535)uint32(0 -> 4,294,967,295)uint64(0 -> 18,446,744,073,709,551,615)
浮点型(IEEE-754 标准):
float32(+- 1e-45 -> +- 3.4 * 1e38)float64(+- 5 * 1e-324 -> 107 * 1e308)
int 型是计算最快的一种类型。
整型的零值为 0,浮点型的零值为 0.0。
float32 精确到小数点后 7 位,float64 精确到小数点后 15 位。由于精确度的缘故,在使用 == 或者 != 来比较浮点数时应当非常小心。最好在正式使用前测试对于精确度要求较高的运算。
3. 字符串类型
Go 支持以下 2 种形式的字面值:
-
解释字符串:
该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:
\n:换行符\r:回车符\t:tab 键\u或\U:Unicode 字符\:反斜杠自身
-
非解释字符串:
该类字符串使用反引号括起来,支持换行,例如:
`This is a raw string \n` 中的 `\n` 会被原样输出。
和 C/C++不一样,Go 中的字符串是根据长度限定,而非特殊字符 \0。
string 类型的零值为长度为零的字符串,即空字符串 ""。
一般的比较运算符(==、!=、<、<=、>=、>)通过在内存中按字节比较来实现字符串的对比。你可以通过函数 len() 来获取字符串所占的字节长度,例如:len(str)。
字符串的内容(纯字节)可以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数:
- 字符串
str的第 1 个字节:str[0] - 第
i个字节:str[i - 1] - 最后 1 个字节:
str[len(str)-1]
需要注意的是,这种转换方案只对纯 ASCII 码的字符串有效。
注意事项 :获取字符串中某个字节的地址的行为是非法的,例如:&str[i]。
字符串拼接符 +
两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。
s2 追加在 s1 尾部并生成一个新的字符串 s。
你可以通过以下方式来对代码中多行的字符串进行拼接:
str := "Beginning of the string " +
"second part of the string"
由于编译器行尾自动补全分号的缘故,加号 + 必须放在第一行。
拼接的简写形式 += 也可以用于字符串:
s := "hel" + "lo,"
s += "world!"
fmt.Println(s) //输出 “hello, world!”
4. 派生类型
- 指针类型(Pointer)
- 数组类型
- 结构化类型(struct)
- Channel 类型
- 函数类型
- 切片类型
- 接口类型(interface)
- Map 类型