- 1. 定义自定义类型(Type Definition)
- 2. 定义类型别名(Type Alias)
- 3. 定义结构体类型(Struct Type)
- 4. 定义接口类型(Interface Type)
- 5. 定义函数类型(Function Type)
- 6. 定义指针类型(Pointer Type)
- 7. 定义映射、切片、通道类型
- 8. 总结
在 Go 语言中,type 关键字用于定义自定义类型或类型别名,是类型系统的核心组成部分,用法灵活且功能强大。以下是其主要用法分类说明:
1. 定义自定义类型(Type Definition)
通过 type 可以基于已有类型创建全新的自定义类型,新类型与原类型不兼容(即使底层结构相同),需显式转换。
语法:
type 新类型名 底层类型
示例:
// 基于 int 定义自定义类型 Age
type Age int
// 基于 string 定义自定义类型 Name
type Name string
func main() {
var age Age = 25
var num int = 30
// 错误:Age 和 int 是不同类型,不能直接赋值
// num = age
// 正确:显式转换
num = int(age)
age = Age(num)
}
扩展:为自定义类型添加方法 自
定义类型可以绑定方法,这是 Go 实现 “面向对象” 特性的重要方式:
type Age int
// 为 Age 类型定义方法
func (a Age) IsAdult() bool {
return a >= 18
}
func main() {
var age Age = 20
fmt.Println(age.IsAdult()) // 输出:true
}
2. 定义类型别名(Type Alias)
通过 type 可以为已有类型创建别名,别名与原类型完全兼容(本质是同一类型),可直接互相赋值。
语法:
type 别名 = 原类型
示例:
// 为 int 定义别名 IntAlias
type IntAlias = int
func main() {
var a int = 10
var b IntAlias = 20
// 兼容:可直接赋值
a = b
b = a
fmt.Println(a, b) // 输出:20 20
}
用途:
- 简化长类型名(如复杂的结构体、函数类型)
- 在重构时临时兼容旧类型
3. 定义结构体类型(Struct Type)
type 结合 struct 定义结构体(类似其他语言的 “类”),用于封装多个字段。
语法:
type 结构体名 struct {
字段1 类型1
字段2 类型2
// ...
}
示例:
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name, p.Age) // 输出:Alice 30
}
4. 定义接口类型(Interface Type)
type 结合 interface 定义接口,用于声明方法集,实现多态。
语法:
type 接口名 interface {
方法1(参数列表) 返回值列表
方法2(参数列表) 返回值列表
// ...
}
示例:
// 定义接口 Animal
type Animal interface {
Speak() string
}
// 实现接口的结构体
type Dog struct{}
func (d Dog) Speak() string {
return "Woof"
}
type Cat struct{}
func (c Cat) Speak() string {
return "Meow"
}
func main() {
var a Animal
a = Dog{}
fmt.Println(a.Speak()) // 输出:Woof
a = Cat{}
fmt.Println(a.Speak()) // 输出:Meow
}
5. 定义函数类型(Function Type)
type 可以将函数签名定义为类型,便于复用和作为参数 / 返回值。
语法:
type 函数类型名 func(参数列表) 返回值列表
示例:
// 定义一个接收 int 并返回 int 的函数类型
type MathFunc func(int) int
// 实现该类型的函数
func double(x int) int {
return x * 2
}
func square(x int) int {
return x * x
}
// 接收函数类型作为参数
func apply(f MathFunc, x int) int {
return f(x)
}
func main() {
fmt.Println(apply(double, 5)) // 输出:10
fmt.Println(apply(square, 5)) // 输出:25
}
6. 定义指针类型(Pointer Type)
结合指针语法,定义基于自定义类型的指针类型(较少直接使用,通常通过 * 动态获取)。
示例:
type Age int
type AgePtr *Age // 定义 Age 指针的自定义类型
func main() {
var age Age = 25
var ptr AgePtr = &age
fmt.Println(*ptr) // 输出:25
}
7. 定义映射、切片、通道类型
通过 type 为映射(map)、切片(slice)、通道(channel)定义自定义类型,增强可读性和复用性。
示例:
// 自定义切片类型
type IntSlice []int
// 自定义映射类型
type StrMap map[string]int
// 自定义通道类型
type MsgChan chan string
func main() {
var s IntSlice = []int{1, 2, 3}
var m StrMap = map[string]int{"a": 1}
var c MsgChan = make(chan string)
}
8. 总结
type 关键字的核心作用是扩展 Go 的类型系统,通过自定义类型实现封装、抽象和类型安全,通过类型别名简化代码。其主要应用场景包括:
- 定义新类型并绑定方法
- 简化复杂类型的使用(别名)
- 声明结构体、接口、函数类型等
- 增强代码可读性和可维护性