文章目录
1 自定义类型是什么?
2 自定义类型如何定义?
- 单个类型定义,也支持使用结构体struct{}
type num int
type str string
type success bool
// 支持结构体struct{}
type Person struct{}
- 批量类型定义
// 批量类型定义
type (
num1 int
num2 int8
num3 int16
)
3 自定义类型与其它数据类型是否可比较?
- 自定义类型不支持跟其他类型直接比较,代码示例如下:
// 给int新定义了类型:code
type code int
func TestDataTypeAlias(t *testing.T) {
var success code = 200
var success1 int = 200
// 报错: invalid operation: success != success1 (mismatched types code and int) if success != success1 {
fmt.Println("因为%s和%s的数据类型不同,不能直接进行比较,需先转换成同一类型!")
} else {
fmt.Println("相同")
}
}
4 自定义类型和类型别名的区别是什么?
- 自定义类型:创建的是一个全新的类型,所以不可与原类型相互赋值和比较。
- 类型别名:是给现有类型创建一个新的名称,跟原数据类型是一样的,可以与原类型相互赋值和比较。Go语言中的特殊数据类型:类型别名Type Alias
// int定义新类型
type code int
// int取别名
type age = int
func TestDataTypeAlias2(t *testing.T) {
var success int = 200
var success1 age = 200
var success2 code = 200
fmt.Printf("%v\n", success == success1) //因为类型取的是别名,其数据类型还是int,没有变化
fmt.Printf("%T\n", success)
fmt.Printf("%T\n", success1)
fmt.Printf("%T\n", success2)
fmt.Printf("%v\n", success == success2) //因为类型不同,所以不能比较,所以返回编译错误
}
5 自定义类型的应用场景有哪些?
5.1 绑定方法
type Celsius float64
// 自定义类型Celsius绑定了方法String
func (c Celsius) String() string {
return fmt.Sprintf("%g°C", c)
}
5.2 实现接口
type Person struct{
name string
}
// 自定义类型:Person
func (p Person)GetName()string{
return p.name
}
5.3 增加安全性
type GoodId int
type Code int
type Age int
5.4 增加代码可读性
// 自定义用户ID
type UserID int
// 形参id的数据类型为自定义类型UserID,直到传入的形参ID为用户ID,增加代码可读性
func getUserByID(id UserID) User {
// 实现代码
}
6 知识总结
7 学习交流
为了方便大家一起学习一起进步,我创建了一个学习交流的平台
感兴趣的朋友们可以加我微信:LH913582934
,备注:CSDN
。