2021-10-25
Go 语言type关键字(别名)
区别类型别名和类型定义
类型别名相当于一个人的小名,类型定义相当于刚出生的起名。
定义类型别名的写法为
type TypeAlias = Type
代码演示
package main
import "fmt"
type IntType int //将IntType定义为int类型
type IntAlias = int //将int取一个别名叫IntAlias
func main() {
//声明a为newint类型
var a IntType
//查看a的类型名
fmt.Printf("a:%T\n",a)
//声明b为IntAlias类型
var b IntAlias
//查看b类型名
fmt.Printf("b:%T",b)
}
main.IntType表示在main包定义的IntType类型,b的类型是int,IntAlias类型是在代码中存在的,编译完成是不会由IntAlias类型
非本地类型不能定义方法
不能在一个非本地的类型 time.Duration 上定义新方法。非本地方法指的就是使用 time.Duration 的代码所在的包,也就是 main 包。因为 time.Duration 是在 time 包中定义的,在 main 包中使用。time.Duration 包与 main 包不在同一个包中,因此不能为不在一个包中的类型定义方法。
package main
import (
"time"
)
// 定义time.Duration的别名为MyDuration
type MyDuration = time.Duration
// 为MyDuration添加一个函数
func (m MyDuration) EasySet(a string) {
}
func main() {
}
解决这个问题有下面两种方法:
- 将类型别名改为类型定义:
type MyDuration time.Duration
,也就是将MyDuration
从别名改为类型。 - 将
MyDuration
的别名定义放在time
包中。
在结构体成员嵌入时使用别名
当类型别名作为结构体嵌入的成员时
package main
import "fmt"
type Person struct {
name string
}
func (p Person) Show() {
fmt.Println("Person-->",p.name)
}
//类型别名
type People = Person
type Student struct {
// 嵌入两个结构
Person
People
}
func (p People) Show2(){
fmt.Println("People------>",p.name)
}
func main() {
//
var s Student
//s.name = "王二狗" //ambiguous selector s.name
s.People.name = "李小花"
s.Person.name = "王二狗"
//s.Show() //ambiguous selector s.Show
s.Person.Show()
s.People.Show2()
fmt.Printf("%T,%T\n",s.Person,s.People) //main.Person,main.Person
}
在通过s直接访问name的时候,或者s直接调用Show()方法,因为两个类型都有 name字段和Show() 方法,会发生歧义,证明People 的本质确实是Person 类型。
学习地址: