>백엔드 개발 >Golang >유형 호환성 제한을 고려할 때 Go에서 임의 함수를 매개변수로 전달하려면 어떻게 해야 합니까?

유형 호환성 제한을 고려할 때 Go에서 임의 함수를 매개변수로 전달하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-03 09:16:39433검색

How Can I Pass an Arbitrary Function as a Parameter in Go, Considering Type Compatibility Limitations?

Go에서 임의의 함수를 매개변수로 전달

Go에서 함수를 매개변수로 전달하면 코드를 동적으로 생성하고 실행할 수 있습니다. 그러나 전달할 수 있는 함수 유형에는 제한이 있습니다.

다음 시나리오를 고려해보세요. 하나의 매개변수를 받아들이고 단일 값을 반환하는 모든 함수를 래핑할 수 있는 데코레이터 함수를 만들고 싶습니다. 인터페이스{} 유형을 허용하거나 반환하는 함수를 처리하기 위해 func(인터페이스{}) 인터페이스{}를 인수로 사용하여 데코레이터 함수를 정의할 수 있습니다.

그러나 func 유형의 함수를 변환하는 것은 불가능합니다. (문자열) 문자열을 func(interface{}) 인터페이스{} 유형으로 암시적으로 변환합니다. 이는 매개변수와 반환 유형 메커니즘이 함수마다 다르기 때문입니다. 인터페이스{} 인수를 전달한다고 해서 모든 유형과의 호환성이 보장되는 것은 아닙니다.

예를 들어 구조체를 인수로 받아들이는 함수는 해당 구조체의 개별 멤버를 받습니다. 대조적으로, 해당 구조체가 포함된 인터페이스를 허용하는 함수는{} 두 단어를 수신합니다. 하나는 유형용이고 다른 하나는 구조체에 대한 포인터용입니다.

해결책

제네릭이 없으면 이 기능을 달성할 수 있는 직접적인 방법이 없습니다. 그러나 해결 방법으로 어댑터 기능을 사용할 수 있습니다.

// Adapter function for func(string) string to func(interface{}) interface{}
func adapter(inner func(string) string) func(interface{}) interface{} {
    return func(arg interface{}) interface{} {
        // Convert the interface{} arg to a string
        argString := arg.(string)
        // Call the inner function with the converted string
        result := inner(argString)
        // Return the result
        return result
    }
}

이제 어댑터 기능을 사용하여 funcB를 데코레이터에 전달할 수 있습니다.

fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))

위 내용은 유형 호환성 제한을 고려할 때 Go에서 임의 함수를 매개변수로 전달하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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