type关键字可以用于定义任何自定义类型,比如常见的

type st1 struct{
}
type ani int

也可以用来起别名

type intalias int // intalias类型是int类型的别名

type func



讲typefunc讲的非常好的一片博客

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
}

标签: none

评论已关闭