Как украсить функции разными подписями в Голанге? - PullRequest
1 голос
/ 20 марта 2019

Я пытался применить декораторы из этого известного Декоратора Голанга , но это работает только для него, потому что все функции, которые он декорирует, прикреплены к структуре, а он просто декорирует одну функцию 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)
...

Как вы можете видетьаргументы все разные, и они также являются чистыми функциями, не привязанными к структуре.Но все они возвращают [] байт и ошибку, поэтому это должно быть возможно.

1 Ответ

0 голосов
/ 20 марта 2019

Отказ от ответственности. Единственное украшение, которое я сделал, - это встраивание структур, но одним из способов может быть определение типа для функции, которую вы хотите декорировать (не обязательно, но упростит подписи):

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

Недостатками этого является наличие декоратора для каждого типа функции. Плюсы , многие из которых мне нравятся , кодировка легко тестируется и отделена от исходной логики, поэтому она не требует каких-либо изменений в вашей исходной функции.


На самом деле, я думаю, что этот подход промежуточное программное обеспечение http использует для http.Handler

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

...