Go语言--2go基础-->基本数据类型### Go语言数据类型详解
Go语言提供了丰富的数据类型,包括基本类型如整型、浮点型、布尔型、字符串,以及复合类型如数组、切片、结构体、函数、map和通道。这些类型与其他语言类似,但在细节上有其独特之处。以下是详细说明:
基本数据类型
整型
整型分为两大类:
- 按长度分:int8、int16、int32、int64
- 对应的无符号整型:uint8、uint16、netsuint32、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位),需考虑平台差异。
- 获取对象长度的 len() 函数返回值会随平台变化。
- 在涉及二进制传输、文件结构描述时,避免使用 int 和 uint,以保持跨平台一致性。切片或 map 元素数量可用 int 表示。
数字字面量语法
从 Go 1.13 起,支持二进制、八进制和十六进制浮点数定义:
- 二进制:
v := 0b00101101(相当于十进制 45) - 八进制:
v := 0o377(相当于十进制 255) - 十六进制:
v := 0x1p-2(相当于 0.25) - 允许用
_分隔数字:v := 123_456(等于 123456)
可用 fmt 函数展示不同进制整数:
go
package main
import "fmt"
func main() {
// 十进制
var a int = 10
fmt.Printf("%d \n", a) // 10
fmt.Printf("%b \n", a) // 1010(二进制占位符%b)
// 八进制(以0开头)
var b int = 077
fmt.Printf("%o \n", b) // 77
// 十六进制(以0x开头)
var c int = 0xff
fmt.Printf("%x \n", c) // ff
fmt.Printf("%X \n", c) // FF
}
浮点型
支持 float32 和 float64,遵循 IEEE 754 标准:
- float32 范围约 3.4e38(常量 math.MaxFloat32)
- float64 范围约 1.8e308(常量 math.MaxFloat64)
打印浮点数示例:
go
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi)
fmt.Printf("%.2f\n", math.Pi)
}
复数
支持 complex64 和 complex128:
- complex64:实部和虚部各32位
- complex128:实部和虚部各64位
go
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)
布尔值
以 bool 类型声明,值仅为 true 或 false:
- 默认值为 false
- 不允许整型强制转换为布尔型
无法参与数值运算或类型转换
字符串
字符串为原生数据类型,内部使用 UTF-8 编码:
go
s1 := "hello"
s2 := "你好"
字符串转义符
常见转义符:
\r:回车符\n:换行符\t:制表符\':单引号\":双引号\\:反斜杠
示例(Windows 文件路径):
go
package main
import "fmt"
func main() {
fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"")
}
多行字符串
使用反引号定义,转义字符无效:
go
s1 := `第一行
第二行
第三行
`
fmt.Println(s1)
字符串常用操作
方法摘要:
- len(str):求长度
-
- 或 fmt.Sprintf:拼接
- strings.Split:分割
- strings.Contains:判断包含
- strings.HasPrefix/HasSuffix:前缀/后缀判断
- strings.Index/LastIndex:子串位置
- strings.Join:连接操作
byte 和 rune 类型
字符用单引号包裹:
byte:uint8 类型,处理 ASCII 字符rune:int32 类型,处理 UTF-8 字符(如中文)
遍历字符串示例:
go
func traversalString() {
s := "hello沙河"
for i := 0; i < len(s); i++ { // byte遍历
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
for _, r := range s { // rune遍历
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
输出:
104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)
注意:中文字符由多个字节组成,需用 rune 遍历避免乱码。
修改字符串
需先转换为 []rune 或 []byte,修改后再转回 string:
go
func changeString() {
s1 := "big"
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))
}
类型转换
Go 只支持强制类型转换,语法为 T(表达式):
go
func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt() 需 float64 参数
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}