如何在Go语言中声明指向未知签名函数的指针?
Go中声明未知签名函数变量的解决办法
Go本身没有C++里decltype这类直接推导类型的关键字,但可以通过以下几种方式实现类似需求:
让编译器自动推导函数类型(推荐)
如果是在声明变量的同时赋值,直接利用Go的类型推导特性,不需要手动写函数签名:// 方式1:var声明+赋值 var foo = log.Printf // 方式2:短变量声明 foo := log.Printf这两种写法都会让编译器自动将
foo的类型设置为和log.Printf完全一致的func(format string, v ...any),效果和C++里decltype(log.Printf) foo;一致,是最简洁安全的方案。用interface{}存储任意函数(适合完全未知签名场景)
如果需要一个能容纳任意签名函数的变量,可以用interface{}类型:var foo interface{} // 可以存储任意函数 foo = log.Printf foo = fmt.Println但调用这类变量中的函数时,必须借助
reflect包来处理参数和调用逻辑:// 调用存储的函数示例 fn := reflect.ValueOf(foo) // 构造对应签名的参数 args := []reflect.Value{reflect.ValueOf("hello %s"), reflect.ValueOf("world")} fn.Call(args)这种方式的缺点是编译阶段没有类型检查,参数不匹配只会在运行时报错,所以非必要不推荐使用。
注意:Go中函数本身就是第一类值,不需要额外使用指针,直接赋值函数即可实现类似“函数指针”的效果。
内容的提问来源于stack exchange,提问作者Charlie Skilbeck
相关产品推荐
相关产品推荐

