当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


GO MakeFunc用法及代码示例


GO语言"reflect"包中"MakeFunc"函数的用法及代码示例。

用法:

func MakeFunc(typ Type, fn func(args []Value)(results []Value)) Value

MakeFunc 返回一个包含函数 fn 的给定类型的新函数。调用时,该新函数执行以下操作:

- converts its arguments to a slice of Values.
- runs results := fn(args).
- returns the results as a slice of Values, one per formal result.

实现 fn 可以假设参数 Value 切片具有由 typ 给出的参数数量和类型。如果 typ 说明了一个可变参数函数,那么最终的 Value 本身就是一个表示可变参数参数的切片,就像在可变参数函数的主体中一样。 fn 返回的结果值切片必须具有 typ 给定的结果数量和类型。

Value.Call 方法允许调用者根据值调用类型化函数;相反,MakeFunc 允许调用者根据值实现类型化函数。

文档的示例部分包含如何使用MakeFunc 为不同类型构建交换函数的说明。

例子:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	// swap is the implementation passed to MakeFunc.
	// It must work in terms of reflect.Values so that it is possible
	// to write code without knowing beforehand what the types
	// will be.
	swap := func(in []reflect.Value) []reflect.Value {
		return []reflect.Value{in[1], in[0]}
	}

	// makeSwap expects fptr to be a pointer to a nil function.
	// It sets that pointer to a new function created with MakeFunc.
	// When the function is invoked, reflect turns the arguments
	// into Values, calls swap, and then turns swap's result slice
	// into the values returned by the new function.
	makeSwap := func(fptr any) {
		// fptr is a pointer to a function.
		// Obtain the function value itself (likely nil) as a reflect.Value
		// so that we can query its type and then set the value.
		fn := reflect.ValueOf(fptr).Elem()

		// Make a function of the right type.
		v := reflect.MakeFunc(fn.Type(), swap)

		// Assign it to the value fn represents.
		fn.Set(v)
	}

	// Make and call a swap function for ints.
	var intSwap func(int, int) (int, int)
	makeSwap(&intSwap)
	fmt.Println(intSwap(0, 1))

	// Make and call a swap function for float64s.
	var floatSwap func(float64, float64) (float64, float64)
	makeSwap(&floatSwap)
	fmt.Println(floatSwap(2.72, 3.14))

}

输出:

1 0
3.14 2.72

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 MakeFunc。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。