>백엔드 개발 >Golang >함수 실행 전후에 코드를 삽입하기 위해 Go에서 함수 래퍼를 어떻게 만들 수 있나요?

함수 실행 전후에 코드를 삽입하기 위해 Go에서 함수 래퍼를 어떻게 만들 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-25 05:31:14567검색

How Can I Create a Function Wrapper in Go to Inject Code Before and After Function Execution?

Go의 함수 래퍼

문제 설명:
함수를 받아들이고 수정된 버전을 반환하는 함수 래퍼를 찾습니다. 이 래퍼는 원래 함수 호출 전후에 사용자 정의 코드 실행을 삽입하는 것을 목표로 합니다.

해결책:
Go에서는 함수 리터럴을 활용하여 이를 달성할 수 있습니다. 특정 함수 서명이 주어지면 동일한 서명이 있는 함수를 수신하고 반환하는 래퍼 함수를 ​​만들 수 있습니다. 래퍼 함수는 원하는 사용자 정의 동작을 통합합니다.

예를 고려해 보겠습니다.

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

함수 수정 및 강화:
다음 래퍼 함수는 로깅을 추가합니다. 원본을 호출하기 전후의 진술 myfunc:

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) // Invokes the provided function
        fmt.Println("After, ret =", ret)
        return
    }
}

사용 및 데모:
설명하기 위해 래핑된 함수는 변수에 할당되고 실행:

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

출력:

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

여러 함수 유형으로 확장:
이 개념은 지원으로 확장될 수 있습니다. 각 고유 유형에 대해 별도의 래퍼 함수를 ​​생성하여 다양한 매개변수 및 반환 유형으로 함수를 래핑합니다. 예를 들어 매개변수나 반환 유형 없이 함수를 래핑하는 경우:

func wrap(f func()) func() {
    return func() {
        fmt.Println("Before func()")
        f()
        fmt.Println("After func()")
    }
}

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

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

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