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
相关用法
- GO MakeTable用法及代码示例
- GO Map用法及代码示例
- GO MarshalIndent用法及代码示例
- GO Marshal用法及代码示例
- GO MatchString用法及代码示例
- GO Match用法及代码示例
- GO MethodSet用法及代码示例
- GO Mul32用法及代码示例
- GO Mkdir用法及代码示例
- GO MkdirTemp用法及代码示例
- GO Modf用法及代码示例
- GO Mul64用法及代码示例
- GO Mod用法及代码示例
- GO MultiReader用法及代码示例
- GO MultiWriter用法及代码示例
- GO Month用法及代码示例
- GO MkdirAll用法及代码示例
- GO PutUvarint用法及代码示例
- GO Scanner.Scan用法及代码示例
- GO LeadingZeros32用法及代码示例
注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 MakeFunc。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。