我如何修改transformNumbers函数,以便它与通用函数doubleG和tripleG一起使用
type trandformFn func(int) int
func transformNumbers(numbers *[]int, transform trandformFn) []int {
dNumbers := []int{}
for _, value := range *numbers {
dNumbers = append(dNumbers, transform(value))
}
return dNumbers
}
func double(value int) int {
return 2 * value
}
func triple(value int) int {
return 3 * value
}
func doubleG[T int | float64 | float32](value T) T {
return 2 * value
}
func tripleG[T int | float64 | float32](value T) T {
return 3 * value
}
我对 TransformFn 类型感到困惑。
尝试类似的东西:
func transformNumbers(numbers *[]int, transform func[T int|float64|float32](T)T) []int {
dNumbers := []int{}
for _, value := range *numbers {
dNumbers = append(dNumbers, transform(value))
}
return dNumbers
}
但出现错误!
func transformNumbers(numbers *[]int, transform func[T int|float64|float32](T)T) []int {
dNumbers := []int{}
for _, value := range *numbers {
dNumbers = append(dNumbers, transform(value))
}
return dNumbers
}
期待这个工作但出现错误!
如果您想在不实例化的情况下使用泛型函数作为另一个函数的参数,则还必须将该函数设为泛型。另外,不要传递指向切片的指针,这是不必要的(切片值已经是包含指向后备数组的指针的标头)。请参阅切片是否按值传递?
例如:
测试它:
这将输出(在Go Playground上尝试):
您当然可以
transformFn
为转换器函数创建一个类型,它也必须是通用的:用法是一样的,在Go Playground上试试这个。
另请注意,预分配结果切片并分配每个转换后的值(不使用
append()
)会更快,所以这样做: