Go语言基础数据类型详解:整型、浮点型、复数与字符串
Go语言作为一门静态强类型的语言,其数据类型设计简洁而高效。掌握Go的基本数据类型是每个开发者深入理解Go语言的基础。本篇文章将详细介绍Go语言中最常见的基本数据类型,包括整型、浮点型、复数、布尔型、字符串等,并结合实例代码演示如何在Go中使用这些数据类型。通过对这些类型的深入理解,读者将能够更好地在项目中应用Go语言,提升代码的质量与效率。
Go语言提供了丰富的数据类型支持,涵盖了从简单的整型到复杂的复数、字符串等多种类型。在整型部分,我们将讲解有符号和无符号整型的区别,并展示其在不同平台上的表现。浮点型支持 float32 和 float64 两种类型,遵循IEEE 754标准,适用于不同精度要求的数值计算。复数类型包括 complex64 和 complex128,用于处理复数运算。布尔类型仅包含 true 和 false,且不能与其他类型直接转换或参与运算。字符串则是Go语言的基础数据类型之一,采用UTF-8编码,并支持各种常见操作如拼接、切割、查找等。
Go语言之基本数据类型
整型
整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64
其中,uint8
就是我们熟知的byte
型,int16
对应C语言中的short
型,int64
对应C语言中的long
型。
类型 | 描述 |
---|---|
uint8 | 无符号 8位整型 (0 到 255) |
uint16 | 无符号 16位整型 (0 到 65535) |
uint32 | 无符号 32位整型 (0 到 4294967295) |
uint64 | 无符号 64位整型 (0 到 18446744073709551615) |
int8 | 有符号 8位整型 (-128 到 127) |
int16 | 有符号 16位整型 (-32768 到 32767) |
int32 | 有符号 32位整型 (-2147483648 到 2147483647) |
int64 | 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) |
特殊整型
类型 | 描述 |
---|---|
uint | 32位操作系统上就是uint32 ,64位操作系统上就是uint64 |
int | 32位操作系统上就是int32 ,64位操作系统上就是int64 |
uintptr | 无符号整型,用于存放一个指针 |
注意: 在使用int
和 uint
类型时,不能假定它是32位或64位的整型,而是考虑int
和uint
可能在不同平台上的差异。
注意事项 获取对象的长度的内建len()
函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int
来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int
和 uint
。
package mainimport "fmt"// 整型func main() {var i1 = 101fmt.Printf("%d\n", i1)fmt.Printf("%b\n", i1) // 把十进制转换成二进制fmt.Printf("%o\n", i1) // 把十进制转换成八进制fmt.Printf("%x\n", i1) // 把十进制转换成十六进x// 八进制i2 := 077fmt.Printf("%d\n", i2)// 十六进制i3 := 0x1234567fmt.Printf("%d\n", i3)// 查看变量的类型fmt.Printf("%T\n", i3)// 声明int8类型的变量i4 := int8(9) // 明确指定int8类型,否则默认int类型fmt.Printf("%T\n", i4)
}
浮点型
Go语言支持两种浮点型数:float32
和float64
。这两种浮点型数据格式遵循IEEE 754
标准: float32
的浮点数的最大范围约为 3.4e38
,可以使用常量定义:math.MaxFloat32
。 float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。
package mainimport "fmt"// 浮点数
func main(){// math.MaxFloat32 // float32最大值f1 := 1.23456fmt.Printf("%T\n", f1) // 默认Go语言中的小数都是float64类型
}E:\go\src\github.com\qiaopengjun\day01\05float>go buildE:\go\src\github.com\qiaopengjun\day01\05float>05float.exe
float64package mainimport "fmt"// 浮点数
func main(){// math.MaxFloat32 // float32最大值f1 := 1.23456fmt.Printf("%T\n", f1) // 默认Go语言中的小数都是float64类型f2 := float32(1.23456) fmt.Printf("%T\n", f2) // 显示声明float32类型// f1 = f2 // float32类型的值不能直接赋值给float64类型的变量
}
复数
complex64和complex128
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)
复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
布尔值
Go语言中以bool
类型进行声明布尔型数据,布尔型数据只有true(真)
和false(假)
两个值。
注意:
- 布尔类型变量的默认值为
false
。 - Go 语言中不允许将整型强制转换为布尔型.
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
package mainimport "fmt"// 布尔类型func main(){b1 := truevar b2 bool // 默认是falsefmt.Printf("%T value:%v\n", b1, b1)fmt.Printf("%T value:%v\n", b2, b2)
}E:\go\src\github.com\qiaopengjun\day01\06bool>go build E:\go\src\github.com\qiaopengjun\day01\06bool>06bool.exe
bool value:true
bool value:false
fmt占位符
package mainimport "fmt"// fmt占位符
func main(){var n = 100// 查看类型fmt.Printf("%T\n", n)fmt.Printf("%v\n", n)fmt.Printf("%b\n", n)fmt.Printf("%d\n", n)fmt.Printf("%o\n", n)fmt.Printf("%x\n", n)var s = "Hello 沙河!"fmt.Printf("字符串:%s\n", s)fmt.Printf("字符串:%v\n", s)fmt.Printf("字符串:%#v\n", s)}E:\go\src\github.com\qiaopengjun\day01\07fmt>go buildE:\go\src\github.com\qiaopengjun\day01\07fmt>07fmt.exe
int
100
1100100
100
144
64
Hello 沙河!
Hello 沙河!E:\go\src\github.com\qiaopengjun\day01\07fmt>go build E:\go\src\github.com\qiaopengjun\day01\07fmt>07fmt.exe
int
100
1100100
100
144
64
字符串:Hello 中国!
字符串:Hello 中国!
字符串:"Hello 中国!"E:\go\src\github.com\qiaopengjun\day01\07fmt>
字符串
Go语言中的字符串以原生数据类型出现。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在Go语言的源码中直接添加非ASCII码字符
GO语言中字符串是用双引号包裹的
GO语言中单引号包裹的是字符
// 字符串
s := "Hello 中国"
// 单独的字母、汉字、符合表示一个字符
c1 := 'h'
c2 := '1'
c3 := '中'
// 字节:1字节=8Bit(8个二进制位)
// 1个字符'A'=1个字节
// 1个utf8编码的汉字'中'= 一般占3个字节
字符串转义符
转义符 | 含义 |
---|---|
\r |
回车符(返回行首) |
\n |
换行符(直接跳到下一行的同列位置) |
\t |
制表符 |
\' |
单引号 |
\" |
双引号 |
\\ |
反斜杠 |
字符串的常用操作
方法 | 介绍 |
---|---|
len(str) | 求长度 |
+或fmt.Sprintf | 拼接字符串 |
strings.Split | 分割 |
strings.contains | 判断是否包含 |
strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
strings.Index(),strings.LastIndex() | 子串出现的位置 |
strings.Join(a[]string, sep string) | join操作 |
package mainimport ("fmt""strings"
)// 字符串func main(){// \ 本来是具有特殊含义的,告诉程序\就是一个单纯的\path := "\"E:\\36期Python全栈开发资料\\Administrator(8E5370323193)\\预习(2)\""path1 := "'E:\\36期Python全栈开发资料\\Administrator(8E5370323193)\\预习(2)'"fmt.Println(path)fmt.Println(path1)s := "I'm ok"fmt.Println(s)// 多行的字符串s2 := `世情薄人情恶雨送黄昏花易落`fmt.Println(s2)s3 := `E:\36期Python全栈开发资料\Administrator(8E5370323193)\预习(2)`fmt.Println(s3)// 字符串相关操作fmt.Println(len(s3))// 字符串拼接name := "理想"world := "远大"ss := name + worldfmt.Println(ss)ss1 := fmt.Sprintf("%s%s", name, world)// fmt.Printf("%s%s", name, world)fmt.Println(ss1)// 分割ret := strings.Split(s3, "\\")fmt.Println(ret)// 包含fmt.Println(strings.Contains(ss, "理想"))// 前缀fmt.Println(strings.HasPrefix(ss, "理想"))// 后缀fmt.Println(strings.HasSuffix(ss, "理想"))s4 := "abcded"fmt.Println(strings.Index(s4, "c"))fmt.Println(strings.LastIndex(s4, "c"))fmt.Println(strings.Index(s4, "d"))fmt.Println(strings.LastIndex(s4, "d"))// 拼接fmt.Println(strings.Join(ret, "+"))}
byte和rune类型
字符用单引号(’)包裹起来
Go 语言的字符有以下两种:
uint8
类型,或者叫 byte 型,代表了ASCII码
的一个字符。rune
类型,代表一个UTF-8字符
。rune类型实际是一个
int32
字符串底层是一个byte数组,可以和[]byte
类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
修改字符串
要修改字符串,需要先将其转换成[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
类型转换
强制类型转换的基本语法如下:
T(表达式)
其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.
package mainimport ("fmt"
)func main() {s := "Hello 中国"// len()求的是byte字节的数量n := len(s)fmt.Println(n)// for i := 0; i < len(s); i++ {// fmt.Println(s[i])// fmt.Printf("%c\n", s[i]) // %c:字符// }// 字符串修改s2 := "白萝卜" // [白 萝 卜]s3 := []rune(s2) // 把字符串强制转换成了一个rune切片s3[0] = '红' // 单引号表示字符fmt.Println(string(s3)) // 把rune切片强制转换成字符串c1 := "红"c2 := '红' // rune(int32)fmt.Printf("c1:%T c2:%T\n", c1, c2) // c1:string c2:int32c3 := "H"c4 := 'H'c5 := byte('H')fmt.Printf("c3:%T c4:%T\n", c3, c4) // c3:string c4:int32fmt.Printf("c4:%d\n", c4) // c4:72fmt.Printf("c5:%T\n", c5) // c5:uint8// 类型转换n1 := 10 // intvar f float64f = float64(n1)fmt.Println(f)fmt.Printf("%T\n", f) // float64}
总结
本文通过示例代码详细讲解了Go语言的基本数据类型及其应用,帮助开发者深入理解如何使用这些类型进行高效编程。通过对整型、浮点型、复数、布尔型和字符串等基本数据类型的分析,读者能够更加灵活地选择合适的类型来处理不同的数据和场景。此外,Go语言还提供了强大的类型转换机制,使得开发者能够在不同的数据类型之间进行转换,进一步提高代码的灵活性和可维护性。掌握这些基础知识将为深入学习Go语言和开发高效Go程序奠定坚实的基础。
🚀 我的个人博客网站正式上线啦!
欢迎大家访问 https://paxon.fun 🎉
博客名称:Paxon Qiao’s Tech Blog ---
未来我会在这里分享 Web3、区块链、编程等技术文章,敬请期待!🙏
🌐 欢迎访问并留言交流!