本文主要是介绍go语言的类型别名与类型定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
类型别名(Type Alias)
类型别名是Go 1.9版本添加的新功能主要用于解决代码升级,迁移中存在的类型兼容性问题
type MyAlias = SomeType
package mainimport "fmt"// 类型别名:将int取一个别名为MyInt
type MyInt = intfunc main() {var num1 MyInt = 5var num2 int = 10// MyInt类型和int类型是相同的类型,可以相互赋值而无需转换num1 = num2num2 = num1fmt.Println(num1, num2) // 10 10fmt.Printf("num1: %T \n", num1) // num1: intfmt.Printf("num2: %T \n", num2) // num1: int
}
在这个例子中,MyInt是int的别名,两者是同一个类型,因此他们可以互相赋值,不需要进行任何类型转换.MyInt类型只会在代码中存在,编译完成时,不会有MyInt类型
类型定义(Type Definition)
type NewType SomeType
package mainimport "fmt"// 类型定义: 创建一个全新类型,名为Feet,底层类型为float64
type Feet float64func main() {var distanceFeet Feet = 5.2var 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 Feetfmt.Printf("distanceFeet: %T \n", distanceFeet) // distanceFeet: main.Feetfmt.Printf("distanceFloat: %T \n", distanceFloat) // distanceFloat: float64
}
在这个例子中,Feet是 float64的全新类型,尽管底层类型相同,但它们在类型系统中被视为不同类型.因此,不能直接进行赋值,需要进行显示类型转换.Feet类型不止是在代码中存在,在编译阶段仍然存在
应用场景
- 类型别名: 可以在需要将相同类型的不同命名用途区分开的情况下使用,例如将 type Email =string 和 type Username = string区分开来
- 类型定义: 可以用于需要严格类型控制的情况下,确保即使底层类型相同,也需要显示类型转换的场景,比如单位不同但底层类型相同的情况.
这篇关于go语言的类型别名与类型定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!