当前位置: 首页 > 面试题库 >

Go中任意功能的包装器

那弘
2023-03-14
问题内容

是否可以为Go中的任意函数创建一个包装程序,该包装程序将使用相同的参数并返回相同的值?

我不是在说看起来完全一样的包装器,看起来可能有所不同,但是应该可以解决问题。

例如,问题可能是创建一个任意函数的包装,该包装首先在缓存中查找函数调用的结果,并且仅在缓存未命中的情况下执行包装的函数。


问题答案:

答案基于@ joshlf13的想法和答案,但对我来说似乎更简单。
http://play.golang.org/p/v3zdMGfKy9

package main

import (
    "fmt"
    "reflect"
)

type (
    // Type of function being wrapped
    sumFuncT func(int, int) (int)

    // Type of the wrapper function
    wrappedSumFuncT func(sumFuncT, int, int) (int)
)

// Wrapper of any function
// First element of array is the function being wrapped
// Other elements are arguments to the function
func genericWrapper(in []reflect.Value) []reflect.Value {
    // this is the place to do something useful in the wrapper
    return in[0].Call(in[1:])
}

// Creates wrapper function and sets it to the passed pointer to function
func createWrapperFunction(function interface {}) {
    fn := reflect.ValueOf(function).Elem()
    v := reflect.MakeFunc(reflect.TypeOf(function).Elem(), genericWrapper)
    fn.Set(v)
}

func main() {
    var wrappedSumFunc wrappedSumFuncT

    createWrapperFunction(&wrappedSumFunc)

    // The function being wrapped itself
    sumFunc := func (a int, b int) int {
        return a + b
    }

    result := wrappedSumFunc(sumFunc, 1, 3)
    fmt.Printf("Result is %v", result)
}


 类似资料:
  • 问题内容: 装饰器模式(功能)有很多好处: 当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。 通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。 但是,我发现的所有示例都非常复杂(例如,编写带有许多中间件的

  • 问题内容: 情况: 我想从控制台获取密码输入- 而不回显用户键入的内容 。有什么可以和Go中的功能媲美吗? 我试过的 我尝试使用,但它回显了键入的内容。 问题答案: 您可以通过执行以下操作来关闭回显,然后在读取密码后将其重新打开

  • 问题内容: 我想表达一个可以分割的函数。我以为我可以这样做: 其中本身需要的类型。但是,这不起作用,因为您不能通过as 。请参阅:https : //golang.org/doc/faq#convert_slice_of_interface,它指出[] interface {}的表示形式是不同的。 上面golang.org链接中提供的建议建议从该切片中重建一个新的接口切片。但是,在我想调用该函数的

  • 问题内容: 我正在通过编写一个小型个人项目来学习Go。即使很小,我还是决定从头开始进行严格的单元测试,以学习Go的良好习惯。 琐碎的单元测试都很好而且花哨的,但是我现在对依赖项感到困惑;我希望能够用模拟函数替换一些函数调用。这是我的代码片段: 我希望能够测试downloader()而不实际通过http获取页面- 即通过模拟get_page(更容易使用,因为它仅将页面内容作为字符串返回)或http.

  • 我有以下设置,我试图创建一个多功能GCP云功能项目,但我未能部署任何功能,因为一个“通用”错误,这一点都不太有帮助。 我的项目结构是这样的,为了保持简单,我只写了函数1,但是有一个函数2,等等。 使用Cloud Functions支持和支持 项目结构: 代码片段: references使用GCP应该能够解析的go模块导入语法。 要部署我称之为gCloud的函数,请从项目的根目录: 我收到的错误是

  • 问题内容: 我正在尝试实现一组功能。上下文是事件服务器;我想防止(或至少警告)为一个事件多次添加同一处理程序。 我已经读过,由于易于检查成员资格,因此映射是惯用的集: 我在使用此范式进行功能时遇到了一些麻烦。这是我的第一次尝试: 很显然,这是行不通的:在Go中,函数不是引用类型,尽管有些人会告诉你它们是。 我有证明,尽管我们不需要它,因为语言规范指出除映射,切片和指针以外的所有内容都是按值传递的。