golang函数作为参数传递和函数类型

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)

}

你可能感兴趣的:(golang,golang)