Go의 함수 래퍼
질문:
Go에서 함수 래퍼를 어떻게 만들 수 있나요? 함수 전후에 코드 삽입으로 이동 실행?
답변:
Go에서는 함수를 인수로 사용하고 새 함수 값을 반환하는 함수 래퍼를 만드는 것이 가능합니다. 이를 통해 래핑된 함수 호출 전후에 코드를 삽입할 수 있습니다.
다음은 래퍼 함수의 예입니다.
func funcWrapper(myFunc interface{}) { fmt.Println("Before") // Call myFunc fmt.Println("After") }
서명으로 래핑된 함수:
래핑할 함수의 시그니처를 알고 있다면 해당 함수 값을 취하는 래퍼 함수를 만들 수 있습니다. 유형을 지정하고 동일한 유형의 다른 함수 값을 반환합니다. 아래에 예시가 나와 있습니다.
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 } }
여러 함수 유형 지원:
여러 함수 유형을 지원하려면 각 고유 유형에 대해 별도의 래퍼 함수를 생성할 수 있습니다.
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에는 제네릭이 부족하지만 리플렉션을 사용하는 보다 일반적인 접근 방식이 가능합니다.
func wrap(f interface{}) interface{} { switch f2 := f.(type) { case func(i int) (ret int): return func(i int) (ret int) { fmt.Println("Before func(i int) (ret int), i =", i) ret = f2(i) fmt.Println("After func(i int) (ret int), ret =", ret) return } case func(): return func() { fmt.Println("Before func()") f2() fmt.Println("After func()") } } return nil }
그러나 이 접근 방식은 인터페이스{} 반환 유형을 사용하며 다음과 같은 경우 유형 어설션이 필요합니다. 사용하고 있습니다.
예 사용법:
wf := wrap(myfunc).(func(int) int) ret := wf(2) fmt.Println("Returned:", ret)
출력:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
위 내용은 실행 전후에 코드를 삽입하려면 Go에서 함수 래퍼를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!