登录
首页 >  Golang >  Go问答

如何将返回类型为 `*int` 的函数转换为返回类型为 `interface{}` 的函数?

来源:stackoverflow

时间:2024-02-10 11:54:24 176浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《如何将返回类型为 `*int` 的函数转换为返回类型为 `interface{}` 的函数?》,涉及到,有需要的可以收藏一下

问题内容

我想要类似以下功能:

func decorateFn(fn func() interface{}) interface{} {
  decorate()

  return fn()
}

func decorateFnInt(fn func() *int) *int {
  return decorateFn(fn).(*int)
}

使用 decoratefn((func() interface{})(fn)).(*int) 不起作用。是否可以将 func() *int 转换为 func() 接口{}?如果是这样,怎么办?


正确答案


使用 go 1.18,您可以使用泛型来实现此目的 - 确保编译时类型安全并且没有运行时类型断言:

func decoratefn[t any](fn func() t) t {
    decorate()

    return fn()
}

func decoratefnint(fn func() *int) *int {
    return decoratefn(fn)
}

可以在编译时通过检查 fn 的类型来推断函数 decoratefn 的类型约束。

https://go.dev/play/p/AAByiBFRQch

编辑:如果您陷入 go 1.17 并且无法使用泛型,您可以使用 interface{} 作为函数参数,但任何类型决策都必须是在运行时执行。您可以尝试 type switch

func decorateFn(v interface{}) interface{} {
    decorate()

    switch t := v.(type) {

    case func() *int:
        return t()

    case func() *string:
        return t()

    default:
        panic(fmt.Sprintf("unsupported type: %T", v))
    }

}

https://go.dev/play/p/gDXTPqA1tXL

到这里,我们也就讲完了《如何将返回类型为 `*int` 的函数转换为返回类型为 `interface{}` 的函数?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>