>백엔드 개발 >Golang >Go의 함수 래퍼는 함수 실행 전후에 어떻게 코드를 삽입할 수 있나요?

Go의 함수 래퍼는 함수 실행 전후에 어떻게 코드를 삽입할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-29 10:52:09599검색

How Can Function Wrappers in Go Inject Code Before and After Function Execution?

Go의 함수 래퍼: 함수 실행에 코드 삽입

함수 래퍼를 만들면 개발자는 함수 전후에 코드를 삽입하여 기존 기능을 향상시킬 수 있습니다. 실행. Go에서 이 기술을 사용하려면 래핑되는 함수의 시그니처를 알아야 하며 동일한 유형의 함수 값을 반환해야 합니다.


다음 예에서는 함수 f를 허용하는 래퍼 함수 랩을 정의합니다. 랩으로 포장된 새 함수를 반환합니다. 이 새로운 함수는 f와 동일한 서명을 갖습니다. f를 실행하기 전후에 Wrap은 메시지를 콘솔에 인쇄합니다.

func wrap(f func(i int) int) func(i int) int {
    return func(i int) (ret int) {
        fmt.Println("Before, i =", i)
        ret = f(i)
        fmt.Println("After, ret =", ret)
        return
    }
}

이를 설명하기 위해 입력 수를 두 배로 늘리는 myfunc라는 함수가 있습니다.

func myfunc(i int) int {
    fmt.Println("myfunc called with", i)
    return i * 2
}

myfunc을 Wrap 함수로 래핑하여 우리 자신의 것을 추가할 수 있습니다.

wf := wrap(myfunc)
ret := wf(2)
fmt.Println("Returned:", ret)

출력:

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4

여러 함수 유형 지원

Go에는 제네릭이 없기 때문에 특정 래퍼 함수를 ​​만들어야 합니다. 지원되는 각 기능 유형에 대해 대안으로, Reflect.MakeFunc()를 사용하여 여러 함수 유형을 처리하도록 래퍼 함수를 ​​작성할 수 있지만 이 접근 방식은 복잡할 수 있습니다.

매개변수나 반환 값이 없는 함수의 경우 랩 함수를 약간 수정할 수 있습니다.

func wrap(f interface{}) interface{} {
    switch f2 := f.(type) {
    case func(i int) (ret int):
        // ...
    case func():
        // ...
    }
    return nil
}

결론적으로 Go의 함수 래퍼는 소스 코드를 변경하지 않고도 기존 함수의 동작을 수정할 수 있는 수단을 제공합니다. 개발자는 특정 요구 사항을 충족하고 코드 유연성을 향상시키기 위해 이러한 래퍼를 사용자 정의할 수 있습니다.

위 내용은 Go의 함수 래퍼는 함수 실행 전후에 어떻게 코드를 삽입할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.