Go基础之数据类型 | 青训营
Go语言数据类型
Go语言的数据类型十分丰富,常见的包括整型、浮点型、字符串和布尔型等。Go语言特有的数据类型包括接口和通道等。
整型
整型主要分为有符号整型和无符号整型两大类:
1.有符号整型:int8、int16、int32、int64。
2.无符号整型:uint8、uint16、uint32、uint64。
有符号整型其二进制最高位储存符号,因此两者的区别就是无符号整型可以存放的正数范围比有符号整型中的正数范围大一倍。
例如:int16的范围为-32768(即−215-2^{15}−215)到32767(即215−12^{15}-1215−1),uint16的范围为0到65535(即2162^{16}216-1)。
package main
import "fmt"
func mian(){
a := 3
b := 2
fmt.Println(a/b)
}
执行结果
1
注意:在Go语言中,对于两个整型变量的除法运算,小数部分将会直接被截取,只取整数部分,不会存在四舍五入的情况。
浮点型
编程语言中的浮点数就是我们常说的小数。
Go语言支持两种浮点数:float32和float64。float32浮点数的最大范围约为3.4e38,float64浮点数最大范围约为1.8e308。
package main
import (
"fmt"
"reflflect"
)
func main() {
a := 3.0
b := 2.0
fmt.Println(a/b)
fmt.Println("变量a的类型为:",reflflect.TypeOf(a))
fmt.Println("变量b的类型为:",reflflect.TypeOf(b))
}
执行结果:
1.5
变量a的类型为:flfloat64
变量b的类型为:flfloat64
此处,我们调用reflect.TypeOf()函数来打印变量a和b的类型。
字符串
Go语言中,字符串的值为双引号中的内容,而且可以直接输入中文。
package main
import "fmt"
func main()
{
str := "你好,世界"
fmt.Println(str)
}
执行结果:
你好,世界
实际编程中,我们会遇到输入多行字符串的情况,此时需要使用'`'字符,即反引号。
package main
import "fmt"
func main()
{
str := `第一行
第二行
第三行
`
fmt.Println(str)
}
执行结果:
第一行
第二行
第三行
字符和转义字符
1.转义字符
字符串中的每个元素就是字符。
Go语言中,字符的值为单引号中的内容,而且可以直接输入中文。
Go语言的字符有以下两种类型:
◇ uint8类型:代表了ASCII码的一个字符。
◇ rune类型:代表了UTF格式的一个字符(如中文、日文或其他复合字符),本质是int32
类型。
package main
import "fmt"
func main(){
asc = 'a'
ch = '我'
fmt.Println(asc)
fmt.Println(ch)
}
执行结果:
97
25105
第一行打印了字符'a'的ASCII码值97,第二行打印了中文字符'我'的int32类型值25105。
2.转义字符
通常我们使用反斜线“\”来对字符进行转义,转义字符具有特定的含义,不同于字符原有的意义,所以称为转义字符。
常见转义符
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\' | 匹配单引号 |
\"" | 匹配双引号 |
\\ | 匹配反斜杠 |
布尔类型
布尔型是最简单的数据类型,只有两个值:false(假)和true(真)。
package main
import "fmt"
func main(){
var flag bool
fmt.Println(flag)
flag = true
fmt.Println(flag)
}
执行结果:
false
true
数据类型判断
如果我们需要判断变量的类型,可以使用Go语言标准库中的reflect包,通过将变量传入此包的TypeOf()方法,得到变量的数据类型。
package main
import (
"fmt"
"reflect"
)
func main(){
a := 1
b := "tst"
c := true
fmt.Println(reflect.TypeOf(a))
fmt.Println(reflect.TypeOf(b))
fmt.Println(reflect.TypeOf(c))
}
执行结果:
int
string
bool
TypeOf()方法直接返回传入变量的类型,通过Println()方法打印到控制台。
数据类型转换
Go语言常见的数据类型之间能够互相进行类型转换,通过使用类型前置加小括号的方式进行。
package main
import (
"fmt"
"reflect"
)
func main(){
var a int16 = 97
fmt.Println("变量a值为:",a,",变量类型为:",reflect.TypeOf(a))
b := int32(a)
fmt.Println("变量b值为:",b,",变量类型为:",reflect.TypeOf(b))
fmt.Println("转换变量b类型为string:",string(b))
}
执行结果:
变量a值为: 97 ,变量类型为: int16
变量b值为: 97 ,变量类型为: int32
转换变量b类型为string: a
在转换变量类型时,我们需要注意变量原本的值是否会发生改变。
package main
import (
"fmt"
"reflect"
)
func main() {
var a int32 = 1234567891
fmt.Println("变量a值为:",a,",变量类型为:",reflect.TypeOf(a))
fmt.Println("转换变量a类型为int16,变量a值变为:",int16(a),", 变量a类型变为:",reflect.TypeOf(int16(a)))
}
执行结果:
变量a值为:1234567891, 变量类型为:int32
转换变量a类型为int16,变量a值变为:723, 变量a类型变为:int16
由于16位有符号整型的范围为-32768~32767,而变量a的值1234567891不在这个范围内,导致变量a原本的值发生改变。
1234567891对应的十六进制为0x499602d3,转变为16位变量后,长度缩短一半,丢失了前(高)4位十六进制,即变为:0x02d3,其对应的十进制值为723。
小结
◇ 整型主要分为有符号整型和无符号整型两大类。
◇ Go语言常见的数据类型之间能够互相进行类型转换,通过使用类型前置加小括号的方式进行。