go type
type关键字可以用于定义任何自定义类型,比如常见的
type st1 struct{
}
type ani int
也可以用来起别名
type intalias int // intalias类型是int类型的别名
type func
type myFunc func(int) int的意思是,定义一个叫做myFunc的函数类型,他的格式是func(int) int,只要输入输出符合这个格式的函数,都能强制类型转换成myFunc类,如
type myFunc func(int) int
func sum10(num int) int {
fmt.Println(num*10)
}
func main() {
newFunc := myFunc(sum10) // 这里把sum10强制类型转换为myFunc
}
这个别名的方式可以帮助我们方便的使用接口和重载,如下
type sumable interface { //定义了一个叫做sumable的接口,拥有sum方法
sum(int, int) int
}
// myFunc继承sumable接口
type myFunc func(int) int //定义了一个叫做myFunc的函数类型,格式为func(int) int
func (f myFunc) sum (a, b int) int { //给myFunc类型增加sum实现方法,只要是myFunc类都能调用这个方法
res := a + b
return f(res) //这里返回f(res),即myFunc(res),也就是调用下面被强制转换成myFunc的那些函数自己本身
}
func sum10(num int) int { //定义了两个函数,类型都是func(int) int,符合myFunc,可以被强制类型转换
return num * 10
}
func sum100(num int) int {
return num * 100
}
// icansum结构体继承sumable接口
type icansum struct { //定义了一个叫做icansum的结构类型
name string
res int
}
func (ics *icansum) sum(a, b int) int { //给icansum结构类型添加了sum方法
ics.res = a + b
return ics.res
}
// handler只要是继承了sumable接口的任何变量都行,我只需要你提供sum函数就好
func handlerSum(handler sumable, a, b int) int { //定义了一个handlerSum,传入了一个sumable,只要这个实例实现了sum方法就能被调用
res := handler.sum(a, b) //调用这个实例的sum方法
fmt.Println(res)
return res
}
func main() {
newFunc1 := myFunc(sum10) //先把sum10类型转换为myFunc,然后赋值给newFunc1
newFunc2 := myFunc(sum100)
handlerSum(newFunc1, 1, 1) // 20 调用newFunc1的sum方法,即第八行,先a+b=2,然后再newFunc1(2),即sum10(2)
handlerSum(newFunc2, 1, 1) // 200
ics := &icansum{"I can sum", 0} //实例化一个icansum
handlerSum(ics, 1, 1) // 2 调用icansum的sum方法,即27行的函数,a+b=2
}
评论已关闭