>백엔드 개발 >Golang >Go 함수의 서명을 문자열로 검색하는 방법은 무엇입니까?

Go 함수의 서명을 문자열로 검색하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-03 10:55:15843검색

How to Retrieve a Go Function's Signature as a String?

Go에서 함수의 서명을 문자열로 검색

문제:

플러그인을 로드하도록 설계된 Go 모듈에서, 미리 결정된 이름과 서명이 있는 특정 기능이 기본 패키지 내에 존재하는지 확인하는 것이 중요합니다. 이 기능이 없거나 예상 서명과 일치하지 않는 경우 설명이 포함된 오류 메시지가 필요합니다. 함수 유형 변수가 주어지면 기본 서명을 어떻게 얻을 수 있습니까?

해결책:

reflect.Type.String()에만 의존하면 유형 이름만 제공됩니다. main.ModuleInitFunc와 같은 것입니다. 전체 서명을 검색하려면 Reflect.Type에서 제공하는 정보를 사용하여 수동으로 구성해야 합니다.

구현:

func signature(f interface{}) string {
    t := reflect.TypeOf(f)
    if t.Kind() != reflect.Func {
        return "<not a function>"
    }

    buf := strings.Builder{}
    buf.WriteString("func (")
    for i := 0; i < t.NumIn(); i++ {
        if i > 0 {
            buf.WriteString(", ")
        }
        buf.WriteString(t.In(i).String())
    }
    buf.WriteString(")")
    if numOut := t.NumOut(); numOut > 0 {
        if numOut > 1 {
            buf.WriteString(" (")
        } else {
            buf.WriteString(" ")
        }
        for i := 0; i < t.NumOut(); i++ {
            if i > 0 {
                buf.WriteString(", ")
            }
            buf.WriteString(t.Out(i).String())
        }
        if numOut > 1 {
            buf.WriteString(")")
        }
    }

    return buf.String()
}

사용:

signature() 함수에 함수 변수를 전달하면 해당 시그니처를 a로 얻을 수 있습니다. 끈. 예:

var myFunc ModuleInitFunc

fmt.Println(signature(func(i int) error { return nil }))
fmt.Println(signature(myFunc))
fmt.Println(signature(time.Now))
fmt.Println(signature(os.Open))
fmt.Println(signature(log.New))
fmt.Println(signature(""))

출력:

func (int) error
func (int) error
func () time.Time
func (string) (*os.File, error)
func (io.Writer, string, int) *log.Logger
<not a function>

참고:

불가능하다는 것을 인식하는 것이 중요합니다. Go는 이에 대한 액세스를 저장하거나 제공하지 않으므로 서명에서 매개변수 및 결과 유형의 이름을 추출합니다. 정보입니다.

위 내용은 Go 함수의 서명을 문자열로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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