Go语言变量类型
- 1. 基本类型
- 1.1 数值类型
- 1.2 布尔类型
- 1.3 字符串类型
- 2. 复合类型
- 2.1 数组
- 2.2 切片
- 2.3 字典(map)
- 2.4 结构体
- 2.5 接口
- 3. 类型转换
- 4. 零值
- 5. 示例
1. 基本类型
Go 语言中的基本类型主要包括数值类型、布尔类型和字符串类型。
1.1 数值类型
- 整型:
int
:根据系统架构(32 位或 64 位)决定大小,通常用作默认整型。int8
:8 位有符号整型,范围:-128 到 127。int16
:16 位有符号整型,范围:-32,768 到 32,767。int32
:32 位有符号整型,范围:-2,147,483,648 到 2,147,483,647。int64
:64 位有符号整型,范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。uint
:无符号整型,与int
大小相同,范围从 0 到2^(bits)
-1。uint8
:8 位无符号整型,范围:0 到 255。uint16
、uint32
、uint64
:无符号整型,范围与相应的有符号整型相同。
var a int = 10
var b uint = 20
var c int64 = 10000000000
- 浮点型:
float32
:32 位浮点数。float64
:64 位浮点数,精度更高。
var pi float32 = 3.14
var e float64 = 2.718281828459
- 复数类型:
complex64
:64 位复数,实部和虚部分别是float32
。complex128
:128 位复数,实部和虚部分别是float64
。
var z complex64 = 1 + 2i // 1 是实部,2i 是虚部
1.2 布尔类型
布尔类型只有两个值:true
和 false
,用于条件判断和控制流。
var isAlive bool = true
1.3 字符串类型
字符串是 UTF-8 编码的字符序列。在 Go 中,字符串是不可变的(immutable),一旦创建就不能修改。
var greeting string = "Hello, World!"
2. 复合类型
复合类型是由多个基本类型组合而成的,主要包括数组、切片、字典、结构体和接口等。
2.1 数组
数组是固定长度的同类型元素的集合。数组的长度是类型的一部分,因此 [3]int
和 [4]int
是不同的类型。
var arr [3]int // 声明一个长度为 3 的整型数组
arr[0] = 1
arr[1] = 2
arr[2] = 3
2.2 切片
切片是动态数组,可以在运行时调整大小。切片是基于数组构建的,具有更灵活的操作。
var slice []int // 声明一个整型切片
slice = append(slice, 1) // 添加元素
slice = append(slice, 2, 3, 4) // 添加多个元素
2.3 字典(map)
字典是键值对集合,用于快速查找。键必须是可比较的类型,值可以是任意类型。
var m map[string]int // 声明一个字符串到整型的映射
m = make(map[string]int)
m["one"] = 1
m["two"] = 2
2.4 结构体
结构体是用户定义的复合类型,可以包含多个不同类型的字段。
type Person struct {Name stringAge int
}var p Person
p.Name = "Alice"
p.Age = 30
2.5 接口
接口是方法的集合,允许你定义某些行为。任何类型只要实现了接口中定义的方法,就可以被视为该接口的实现。
type Stringer interface {String() string
}func Print(s Stringer) {fmt.Println(s.String())
}
3. 类型转换
Go 允许进行类型转换,但需要显式声明。
var a int = 10
var b float64 = float64(a) // 将 int 转换为 float64
4. 零值
在 Go 中,变量在声明时会被赋予默认的“零值”。对于不同类型的零值如下:
- 整型:
0
- 浮点型:
0.0
- 布尔型:
false
- 字符串:
""
(空字符串) - 切片、字典、指针、接口:
nil
5. 示例
下面是一个完整的 Go 程序示例,展示了各种变量类型的使用:
package mainimport ("fmt"
)func main() {// 基本类型var a int = 10var b float64 = 3.14var isAlive bool = truevar greeting string = "Hello, Go!"fmt.Println("Integer:", a)fmt.Println("Float:", b)fmt.Println("Boolean:", isAlive)fmt.Println("String:", greeting)// 数组var arr [3]int = [3]int{1, 2, 3}fmt.Println("Array:", arr)// 切片slice := []int{1, 2, 3}slice = append(slice, 4, 5)fmt.Println("Slice:", slice)// 字典m := make(map[string]int)m["one"] = 1m["two"] = 2fmt.Println("Map:", m)// 结构体type Person struct {Name stringAge int}p := Person{Name: "Alice", Age: 30}fmt.Println("Person:", p)// 接口type Stringer interface {String() string}func (p Person) String() string {return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age)}Print(p)
}func Print(s Stringer) {fmt.Println(s.String())
}
在这个示例中,我们展示了基本类型、复合类型(数组、切片、字典、结构体)、接口的用法,以及如何定义和实现接口。