문제:
플러그인을 로드하도록 설계된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!