调用泛型函数类型:无效操作:不能调用非函数 fn

我将发布我目前正在处理的代码示例。我得到了错误:


错误:无效操作:无法调用非函数 fn(MapFunc 约束的 MF 类型变量)


是否可以使用包含不同函数签名的约束以这种方式使用?(如果可能的话,我想了解如何让我写的东西首先发挥作用。)


这是示例:


package main


import "fmt"


// MapFunc constraint used in Funcy

type MapFunc interface {

    func(s string, ss []string) []string | func(s string, ss []string) []bool

}


// MapFuncType used for Funcy return constraint

type MapFuncType interface {

    string | bool

}


// Funcy preforms map operation on generic map functions

func Funcy[MF MapFunc, MFT MapFuncType](s string, ss []string, fn MF) []MFT {

    return fn(s, ss)

    // error: invalid operation: cannot call non-function fn (variable of type

    // MF constrained by MapFunc)

}


// appendTo adds given string to the end of each index of given slice of strings

// Ex. appendTo("_", []string{"append", "to"}) --> []string{"append_", "to_"}

func appendTo(s string, ss []string) []string {

    var slice []string

    for _, v := range ss {

        slice = append(slice, v+s)

    }

    return slice

}


// isMatch checks given string against each index in given string slice for a

// match

// Ex. isMatch("hi", []string{"hello", "hi"}) --> []bool{false, true}

func isMatch(s string, ss []string) []bool {

    var slice []bool

    for _, v := range ss {

        slice = append(slice, s == v)

    }

    return slice

}


func main() {

    slice1 := []string{"append", "to"}

    slice2 := []string{"hello", "hi"}


    fmt.Println(Funcy(slice1, appendTo))

    // want: []string{"append_", "to_"}

    // got: error: cannot infer MFT


    fmt.Println(Funcy(slice2, isMatch))

    //[]bool{false, true}

    // got: error: cannot infer MFT

}


有只小跳蛙
浏览 217回答 1
1回答

哈士奇WWW

当您将类型参数约束MF为 时MapFunc,您无法调用fn,因为 的MapFunc类型集中的函数类型没有相同的签名。它们有不同的返回类型[]string和[]bool.所以fn有效类型的变量不支持被调用,你会得到(有点神秘的)错误信息“无法调用非函数 fn”。更正式地说,只能调用具有类型函数核心类型MapFunc的值,但约束没有核心类型。解决方法是参数化MapFunc并使用该类型参数作为返回值,这样在实例化时,它就会有一个核心类型:type MapFunc[T MapFuncType] interface {    func(s string, ss []string) []T}MFT并使用in实例化约束Funcy:func Funcy[MF MapFunc[MFT], MFT MapFuncType](s string, ss []string, fn MF) []MFT {    return fn(s, ss)}游乐场:https ://go.dev/play/p/q88aJLgnzXZ
打开App,查看更多内容
随时随地看视频慕课网APP