Go 语言数据类型详解
Go 语言是一种静态类型语言,在编译时就会对变量的类型进行检查和绑定。数据类型可分为基本类型、复合类型、引用类型和接口类型。本文将详细讲解 Go 语言的数据类型及其使用方法。
1. 基本数据类型(Primitive Types)
Go 语言提供了一些基础数据类型:
- 整数类型:
int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64 - 浮点类型:
float32、float64 - 复数类型:
complex64、complex128 - 布尔类型:
bool - 字符串类型:
string - 字节类型:
byte(等价于uint8)、rune(等价于int32,用于 Unicode 字符)
(1)整数类型
var a int = 100
var b uint = 200
var c int8 = 127
var d uint16 = 65535
int和uint:默认根据系统架构(32 位或 64 位)选择int32或int64。int8/uint8:8 位整数,int8范围-128~127,uint8范围0~255。int16/uint16、int32/uint32、int64/uint64:更大范围的整数。
(2)浮点类型
var f1 float32 = 3.14
var f2 float64 = 3.1415926535
float32:精度较低,约 6-7 位小数。float64:高精度,约 15-16 位小数(默认)。
(3)复数类型
var c1 complex64 = complex(1, 2) // 1 + 2i
var c2 complex128 = complex(3, 4) // 3 + 4i
complex64由两个float32组成。complex128由两个float64组成。
(4)布尔类型
var flag bool = true
- 只能取
true或false,默认值false。
(5)字符串类型
var s string = "Hello, Go!"
fmt.Println(len(s)) // 获取字符串长度
- Go 语言的字符串是不可变的,可以使用
+连接。
多行字符串:
s := `This is
a multi-line string`
(6)字节类型
var b1 byte = 'A' // 等价于 uint8
var r rune = '国' // 等价于 int32
fmt.Println(b1, r) // 65 22269
byte:存储 ASCII 字符。rune:存储 Unicode 字符。
2. 复合数据类型(Composite Types)
(1)数组(Array)
var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr[0]) // 访问元素
- 数组长度是固定的。
(2)切片(Slice)
s := []int{1, 2, 3}
fmt.Println(s[:2]) // [1, 2]
s = append(s, 4) // 动态扩展
- 切片是对数组的动态引用。
(3)Map(字典)
m := map[string]int{"Alice": 90, "Bob": 85}
fmt.Println(m["Alice"])
m["Tom"] = 88
map[KeyType]ValueType形式。
(4)结构体(Struct)
type Person struct {
Name string
Age int
}
p := Person{"Alice", 25}
fmt.Println(p.Name)
struct是 Go 语言自定义数据类型。
3. 引用类型(Reference Types)
(1)指针(Pointer)
var p *int
num := 100
p = &num
fmt.Println(*p) // 100
*T表示指向T类型的指针。&取地址,*解引用。
(2)接口(Interface)
type Speaker interface {
Speak()
}
type Dog struct{}
func (d Dog) Speak() {
fmt.Println("Woof!")
}
var s Speaker = Dog{}
s.Speak()
interface{}是泛型类型,可存储任何值。
4. 特殊数据类型
(1)空接口 interface{}
var i interface{} = "Hello"
fmt.Println(i) // Hello
- 空接口可存储任意类型的数据。
(2)nil
var p *int = nil
var m map[string]int = nil
nil代表未初始化的引用类型(指针、map、slice、channel、interface)。
5. 类型转换
Go 语言不支持隐式类型转换,需要显式转换:
var a int = 100
var b float64 = float64(a) // int 转 float64
var c string = strconv.Itoa(a) // int 转 string
常见转换:
| 源类型 | 目标类型 | 转换方法 |
|---|---|---|
| int -> float64 | float64(i) | |
| float64 -> int | int(f) | |
| int -> string | strconv.Itoa(i) | |
| string -> int | strconv.Atoi(s) |