문제 설명:
함수를 받아들이고 수정된 버전을 반환하는 함수 래퍼를 찾습니다. 이 래퍼는 원래 함수 호출 전후에 사용자 정의 코드 실행을 삽입하는 것을 목표로 합니다.
해결책:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!