Как реализовать эквивалент Python functools.wraps в Go?

Я знаю, что могу обернуть функции в Go через функцию возврата, ошибка, как реализовать эквивалент Python functools.wraps в Go? Как прикрепить атрибут к функциям в Go? Как и код ниже в Python.

from functools import wraps

def d(f):
    def wrapper(*args):
        f(*args)

    return wrapper

def d_wraps(f):
    @wraps(f)
    def wrapper(*args):
        f(*args)

    return wrapper

@d
def f(a=''):
    print a

@d_wraps
def g(a=''):
    print a

if __name__ == '__main__':
    print 'function name: ', f.__name__
    f('abc')

    print 'function name: ', g.__name__
    g('abc')

d не меняет имя функции, d_wraps меняет имя функции. Результат

function name:  wrapper
abc
function name:  g
abc

Я хочу использовать упакованную функцию в качестве ключа во время выполнения. Поэтому я хочу оставить имя функции без изменений после переноса. Как реализовать работу, которая d_wraps делает в го?

1 ответ

Как прикрепить атрибут к функциям в Go?

Нет, вы не можете прикрепить атрибут к функциям в Go.

Как реализовать работу, которую d_wraps выполняет в Go?

Вы можете реализовать другую функцию, вызывая ваши функции, и вызывать функцию с новым именем.

package main

import "fmt"

func main() {
   g_warp("abc")
}

func g(a string){
   fmt.Println(a);
}

func g_warp(a string){
   g(a+"_mysuffix");
}

Если вы хотите изменить содержимое функции, но использовать то же имя функции, вы можете использовать глобальную переменную функции:

package main

import (
    "fmt"
)

func main() {
    g = gV2
    g("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
func gV2(a string){
    gV1(a+"_suffix")
}

Если у вас много функций с одинаковой логикой переноса, вы можете передать функцию origin и вернуть новую функцию:

package main

import (
    "fmt"
)

func main() {
    g = wrap(g)
    g("hello")
    f = wrap(f)
    f("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
var f = fV1;

func fV1(a string){
    fmt.Println(a+" "+a)
}
func wrap(originFn func(a string)) func(a string){
    return func(a string){
         originFn(a+"_suffix")
    }
}
Другие вопросы по тегам