golang函数作为参数传递和函数类型
函数参数
golang中函数方法也可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调函数或方法。
package main
import (
"log"
"reflect"
"runtime"
)
func main() {
//test()
//调用方法传的是一个函数
funttt(ttt)
}
func ttt() {
log.Println("tttt")
}
//参数是一个函数
func funttt(aa func()) {
log.Println("aaa")
funcName,file,line,ok := runtime.Caller(0)
if(ok){
log.Println("func name: " + runtime.FuncForPC(funcName).Name())
log.Printf("file: %s, line: %d\n",file,line)
}
funType := reflect.TypeOf(aa)
funName := funType.Name()
log.Printf("aaaa %s", funName)
aa();
}
func test() {
test2()
}
func test2(){
pc,file,line,ok := runtime.Caller(2)
log.Println(pc)
log.Println(file)
log.Println(line)
log.Println(ok)
f := runtime.FuncForPC(pc)
log.Println(f.Name())
pc,file,line,ok = runtime.Caller(0)
log.Println(pc)
log.Println(file)
log.Println(line)
log.Println(ok)
f = runtime.FuncForPC(pc)
log.Println(f.Name())
pc,file,line,ok = runtime.Caller(1)
log.Println(pc)
log.Println(file)
log.Println(line)
log.Println(ok)
f = runtime.FuncForPC(pc)
log.Println(f.Name())
}
函数类型
package main
import "fmt"
// 调用器接口
type Invoker interface {
// 需要实现一个Call方法
Call(interface{})
}
// 结构体类型
type Struct struct {
}
// 实现Invoker的Call
func (s *Struct) Call(p interface{}) {
fmt.Println("from struct", p)
}
// 函数定义为类型
type FuncCaller func(interface{})
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {
// 调用f函数本体
f(p)
}
func main() {
// 声明接口变量
var invoker Invoker
// 实例化结构体
s := new(Struct)
// 将实例化的结构体赋值到接口
invoker = s
// 使用接口调用实例化结构体的方法Struct.Call
invoker.Call("hello")
// 将匿名函数转为FuncCaller类型,再赋值给接口
invoker = FuncCaller(func(v interface{}) {
fmt.Println("from function", v)
})
// 使用接口调用FuncCaller.Call,内部会调用函数本体
invoker.Call("hello")
abc := FuncColl(func() string {
fmt.Println("FuncColl ")
return "aaa44444"
})
abc.cfd()
}
// 函数定义为类型
type FuncColl func() string
// 实现Invoker的Call
func (f FuncColl) abc() string {
// 调用f函数本体
fmt.Println("2222")
f.cfd()
return "ddd"
}
// 实现Invoker的Call
func (f FuncColl) cfd() {
// 调用f函数本体
fmt.Println("1111")
aaaa := f()
fmt.Printf(aaaa)
}