类型别名(Type Alias)
类型别名是Go 1.9版本添加的新功能主要用于解决代码升级,迁移中存在的类型兼容性问题
type MyAlias = SomeType
package main
import "fmt"
// 类型别名:将int取一个别名为MyInt
type MyInt = int
func main() {
var num1 MyInt = 5
var num2 int = 10
// MyInt类型和int类型是相同的类型,可以相互赋值而无需转换
num1 = num2
num2 = num1
fmt.Println(num1, num2) // 10 10
fmt.Printf("num1: %T \n", num1) // num1: int
fmt.Printf("num2: %T \n", num2) // num1: int
}
在这个例子中,MyInt是int的别名,两者是同一个类型,因此他们可以互相赋值,不需要进行任何类型转换.MyInt类型只会在代码中存在,编译完成时,不会有MyInt类型
类型定义(Type Definition)
type NewType SomeType
package main
import "fmt"
// 类型定义: 创建一个全新类型,名为Feet,底层类型为float64
type Feet float64
func main() {
var distanceFeet Feet = 5.2
var distanceFloat float64 = 10.5
// 以下赋值会导致编译错误,因为类型定义创建了全新类型,需要显示转换
//distanceFloat = distanceFeet Cannot use 'distanceFeet' (type Feet) as the type float64
//distanceFeet = distanceFloat Cannot use 'distanceFloat' (type float64) as the type Feet
fmt.Printf("distanceFeet: %T \n", distanceFeet) // distanceFeet: main.Feet
fmt.Printf("distanceFloat: %T \n", distanceFloat) // distanceFloat: float64
}
在这个例子中,Feet是 float64的全新类型,尽管底层类型相同,但它们在类型系统中被视为不同类型.因此,不能直接进行赋值,需要进行显示类型转换.Feet类型不止是在代码中存在,在编译阶段仍然存在
应用场景
- 类型别名: 可以在需要将相同类型的不同命名用途区分开的情况下使用,例如将 type Email =string 和 type Username = string区分开来
- 类型定义: 可以用于需要严格类型控制的情况下,确保即使底层类型相同,也需要显示类型转换的场景,比如单位不同但底层类型相同的情况.