gpt4 book ai didi

go - Golang中如何装饰不同签名的函数?

转载 作者:IT王子 更新时间:2023-10-29 02:19:23 24 4
gpt4 key购买 nike

我尝试应用来自这个著名的 Golang decorators talk 的装饰器但它只对他有用,因为他正在装饰的所有函数都附加到一个结构,而他只是在装饰一个 Do() 函数。我见过的所有其他教程也都是这样做的,这很烦人。

我想用一个base58/64编码器函数来装饰这些函数

func SpendTx(senderID, recipientID string, amount, fee utils.BigInt, payload string, ttl, nonce uint64) (rlpRawMsg []byte, err error)
func NamePreclaimTx(accountID, commitmentID string, fee uint64, ttl, nonce uint64) (rlpRawMsg []byte, err error)
func NameClaimTx(accountID, name string, nameSalt, fee uint64, ttl, nonce uint64) (rlpRawMsg []byte, err error)
...

正如你所看到的,参数都是不同的,它们也是纯函数,没有附加到结构上。但它们都返回 []byte 和一个错误,所以这应该是可能的。

最佳答案

免责声明我所做的唯一装饰是通过嵌入结构,但一种方法是为您想要装饰的函数定义一个类型(并非绝对必要,但会使签名更简单):

type SpendTXFn = func SpendTx(senderID, recipientID string, amount, fee utils.BigInt, payload string, ttl, nonce uint64) (rlpRawMsg []byte, err error)

现在函数可以根据这种类型进行对话,装饰器函数将包含与这种类型相同的调用签名

func EncodedSpendTX(s SpendTX) SpendTX {
return func(senderID, recipientID string, amount, fee utils.BigInt, payload string, ttl, nonce uint64) (rlpRawMsg []byte, err error) {
// compute decorated result
res, err := s(senderID, recipientID, amount, fee, payload, ttl, nonce)
if err != nil {
return res, err
}
// encode the res
// return encoded res
}
}

现在您可以装饰您的 SpendTX 函数:

decorated := EncodedSpendTX(originalSpendTx)

decorated(...) -> []byte, err

缺点是每个函数类型都有一个装饰器。优点是 many with my favorite being编码易于测试并与原始逻辑分离,因此不需要对原始函数进行任何更改。


其实我觉得这是go的http中间件通过http.Handler

采取的方式

https://www.alexedwards.net/blog/making-and-using-middleware

关于go - Golang中如何装饰不同签名的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com