Go语言以其精炼的语法和卓越的性能,正日益成为现代软件开发的关键驱动力。在Go语言的众多特性中,基本数据类型的重要性不言而喻,它们是构建任何复杂应用程序的基石。正如掌握任何新语言需从其基础元素开始,Go语言的学习同样始于对其基本数据类型的深入理解。
在Go语言的世界中,基本数据类型不仅是编程的起点,更是支撑整个程序架构的支柱。熟悉这些类型,就如同掌握了Go语言的“字母表”,是深入探索和应用Go语言不可或缺的第一步。
Go语言提供的基本 数据类型
Go语言的基本数据类型构成了程序设计的基础框架,它们可以归纳为以下几类。
- 整型:提供了一系列不同位数和符号的整数类型,包括
int
、int8
、int16
、int32
、int64
及无符号整数uint
等,以满足不同精度和性能需求。 - 浮点型:用于表示实数,包含单精度的
float32
和双精度的float64
,适用于需要执行浮点运算的场景。 - 布尔型:表示逻辑值,仅有
true
和false
两个值,常用于逻辑判断和条件控制。 - 字符串:用于存储和操作文本数据,是由字符组成的不可变序列。
- rune 类型:代表一个Unicode码点,等同于
int32
,用于处理Unicode字符。 - byte类型:作为
uint8
的别名,常用于处理字节数据。
这些基本数据类型是Go语言编程的基石,为开发者提供了丰富的选项来实现各种程序设计需求。
int类型
定义int类型:
var int1 = 1
fmt.Printf("int1类型:%T\n", int1)
输出结果如下:
int1类型:int
注意:
%T
查看变量的类型。
进制转化
数值声明与进制表达相互独立,在Go中均以int
类型存储,提供了在不同进制间灵活转换的能力。利用fmt
包的格式化动词,我们可以在输出时直接转换进制,简化代码并提高效率,便于开发中快速展示数值的各种进制形式。
var i1 = 101
fmt.Printf("%d\n", i1) //转成十进制
fmt.Printf("%b\n", i1) //把十进制转成二级制
fmt.Printf("%o\n", i1) //把十进制转成八进制
fmt.Printf("%x\n", i1) //把十进制转成十六进制
fmt.Println("-----")
输出结果如下:
数值为:101
把十进制转成二级制:1100101
把十进制转成八进制:145
把十进制转成十六进制:65
定义八进制
八进制一定是以0开头的,逢八进一位。
i2 := 077
fmt.Printf("i2十进制:%d\n", i2)
fmt.Printf("i2八进制:%o\n", i2)
fmt.Printf("i2类型%T\n",i2)
输出结果如下:
i2十进制:63
i2八进制:77
i2类型int
定义十六进制
从0到f,逢十六进一。
i3 := 0x1234567
fmt.Printf("i3十进制:%d\n", i3)
fmt.Printf("i3十流进制:%x\n", i3)
// %T 查看变量的类型
fmt.Printf("i3十进制数据类型:%T\n", i3)
输出结果如下:
i3十进制:19088743
i3十六进制:1234567
i3十进制数据类型:int
总结:我们发现直接定义十进制、八进制、十六进制的变量,变量的类型都是int型。
抛出问题
我们怎么定义 int8/int16/int32/int64 类型的数据呢?其实非常简单:
i4 := int8(1)
i5 := int16(1)
i6 := int32(1)
i7 := int64(1)
fmt.Printf("i4:%T\n", i4)
fmt.Printf("i5:%T\n",i5)
fmt.Printf("i6:%T\n",i6)
fmt.Printf("i7:%T\n",i7)
输出结果如下:
i4:int8
i5:int16
i6:int32
i7:int64
抛出问题:Go有这么多种int类型,怎么选择使用哪种呢?
首先要知道这些类型的区别:
- int8类型大小为 1 字节
- int16类型大小为 2 字节
- int32类型大小为 4 字节
- int64类型大小为 8 字节
- int类型的大小为4个字节或8个字节
其中,int类型要重点说一下:Go语言中 int 的大小和操作系统位数相关。如果是32位操作系统,int 类型的大小就是4字节;如果是64位操作系统,int 类型的大小就是8个字节。
由此可以知道,根据自己需要的字节数来选择,当然选择int类型是最省心安全的,但是当取值范围小的时候,会浪费存储空间。
float类型
Go中的float可以细分为:float32和float64。
定义float
f1 := 1.0
fmt.Printf("f1类型:%T\n", f1) // Go语言中的小数默认类型是:float64
输出结果如下:
f1类型:float64
分析:在未指定类型定义float时,默认的类型是float64。与int类型的定义是一致的。
反思:这种设计也可以很好理解,出于数据安全的考虑,设置数据类型对应的最大内存空间的类型,避免内存溢出等问题。
定义float32类型
聪明的你一定会想到,和定义int8是一样的:
f2 := float32(1.4321)
fmt.Printf("%T\n", f2)
输出结果如下:
f2类型:float32
小技巧
我们可以通过内置的Math函数,获得常用的数值,比如:
var maxFloat = math.MaxFloat32;
println(maxFloat)
输出结果如下:
+3.402823e+038
注意:在Go中,数据类型是有严格区分的,不同类型之间不能互相转换,比如:
bool类型
定义
b1 := true
fmt.Printf("b1类型:%T\n", b1)
输出结果如下:
b1类型:bool
默认值为false
var b2 bool
// 前面有2个% 后面也要传2次参数
fmt.Printf("b2类型为:%T 值为: %v\n", b2, b2)
输出结果如下:
b2类型为:bool 值为: false
字符串类型
- Go语言中的字符串由双引号包裹。
s1 := "123"
s2 := "我们"
s3 := "mystring"
- Go语言中单引号包裹的是字符(单独的字母、汉字、符号、数字)
s1 := '1'
s2 := '我'
s3 := 's'
// 字节:1个字节=8Bit(8个二进制位)
// 一个字符'A' = 1个字节
// 一个utf8编码的汉字一般占3个字节 (比如‘沙’)
rune类型
rune它是int32的别名(-2147483648~2147483647),相比于byte(-128~127),可表示的字符更多。由于rune可表示的范围更大,所以能处理一切字符,当然也包括中文字符。在平时计算中文字符,可用rune。
当我们数据中有中文时,一定要注意rune的处理。
len()详解
len()获得的是 byte 字节的数量,一个中文占用3个字节。
s := "Hello王"
sHello := "Hello"
sWang := "王"
//len()获得的是 byte 字节的数量
fmt.Println(len(s))
fmt.Println(len(sHello))
fmt.Println(len(sWang))
输出结果是:8 5 3。
循环输出字符串
s := "Hello王"
for i := 0; i < len(s); i++ {
fmt.Printf("%c\n", s[i])
}
输出结果如下:
我们发现英文可以正常输出,但是中文通过这种方式输出会乱码。
循环输出中文字符串
我们可以通过for range循环,从字符串中拿出具体的字符:
s := "Hello王"
for _, c := range s {
fmt.Printf("%c\n", c) //%c 字符
}
输出结果如下:
字符串的修改
字符串修改是不能直接修改的,需要转成rune切片后再修改:
s2 := "小白兔"
s3 := []rune(s2) //把字符串强制转成rune切片
s3[0] = '大' //注意 这里需要使用单引号的字符,而不是双引号的字符串
fmt.Println(string(s3)) //把rune类型的s3强转成字符串
输出结果:大白兔
。
字符和字符串的区别
字符和字符串是两种不同的数据类型,它们的主要区别在于表示和存储的方式。
字符使用单引号''
定义,表示一个单独的字符,等同于int32
类型,存储为单个Unicode码点。
字符串使用双引号""
定义,可以包含多个字符,存储为uint8
类型的字节序列,如果是UTF-8编码的字符串,一个字符可能占用多个字节。
c1 := "红"
c2 := '红'
fmt.Printf("c1的类型:%T c2的类型:%T \n", c1, c2)
c3 := "H"
c4 := 'H'
fmt.Printf("c3的类型:%T c4的类型:%T \n", c3, c4)
输出结果如下:
c1的类型:string c2的类型:int32
c3的类型:string c4的类型:int32
总结:我们发现只要是双引号包裹的类型就是string,只要是单引号包裹的类型就是int32,也就是rune。与中英文无关。
知识点:rune的别名是int32。
类型转换
类型转换在编程中是将一个类型的值转换成另一个类型的操作。在Go语言中,如果需要将一种基本类型的值转换成另一种基本类型,需要显式地进行类型转换。
n1 := 10
var f float64
f = float64(n1)
fmt.Printf("f的类型是:%T f的值是:%v\n", f,f)
输出结果如下:
f的类型是:float64 f的值是:10
总结
- Go语言中对类型有严格的要求,不同类型之间不能直接转换,哪怕int8/int16之间也不能转换。
- 声明变量同时赋值的方式,如果没有指定明确的数据类型,会默认使用
范围大
的类型,比如 int、float64、false。 - 字符串的修改要转成rune切片,而不能像PHP一样直接修改。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:csdn面试群。