>백엔드 개발 >Golang >리플렉션을 사용하여 Go 메서드 매개 변수의 이름을 가져올 수 없는 이유는 무엇입니까?

리플렉션을 사용하여 Go 메서드 매개 변수의 이름을 가져올 수 없는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-22 08:37:091051검색

Why Can't I Get the Name of a Go Method Parameter Using Reflection?

메서드 매개변수의 이름 가져오기

Go 메소드를 사용할 때 특정 매개변수의 이름을 가져오는 것이 바람직할 수 있습니다. 예를 들어, 다음 메소드의 경우:

func (t *T) TMethod(data *testData) (interface{}, *error) {
    ...
}

은 매개변수 데이터의 이름을 가져오려고 합니다. 그러나 다음 리플렉션 코드를 사용하면 구조체 이름 testData가 반환됩니다.

reflect.ValueOf(T).MethodByName("TMethod").Type.In(0).Elem().Name()

왜 매개변수 이름을 얻을 수 없나요?

사실 Go 언어에서는 함수나 메소드 매개변수의 이름을 알아낼 방법이 없습니다. 호출자에게는 매개변수의 이름이 중요하지 않기 때문입니다. 중요한 것은 매개변수의 유형과 순서뿐입니다.

함수 유형은 동일한 매개변수 및 결과 유형을 갖는 모든 함수의 모음을 나타냅니다. 두 함수의 매개변수와 결과 유형이 동일한 경우 매개변수 이름에 관계없이 해당 유형은 동일합니다. 다음 코드는 true를 인쇄합니다.

func f1(a int) {}
func f2(b int) {}

fmt.Println(reflect.TypeOf(f1) == reflect.TypeOf(f2))

매개 변수 이름을 제공하지 않는 함수나 메서드를 만드는 것도 가능합니다(매개 변수나 결과 목록에 이름이 모두 있거나 전혀 없는 경우). 다음 코드는 작동합니다.

func NamelessParams(int, string) {
    fmt.Println("NamelessParams called")
}

해결 방법

수신 API 매개변수를 Go 함수/메서드 매개변수에 매핑하는 명명된 매개변수 프레임워크를 생성하려는 경우 다음을 수행할 수 있습니다. Reflect 패키지(예: Value.FieldByName() 및 Type.FieldByName())를 사용하여 명명된 필드를 가져올 수 있으므로 구조체를 사용하거나 맵을 사용할 수 있습니다. 다음 관련 질문을 참조하세요.

함수 필드 초기화

자세한 내용과 예는 Google 메일링 리스트의 관련 기사를 참조하세요.

Go에서 이름 없는 인수가 참인가요?

위 내용은 리플렉션을 사용하여 Go 메서드 매개 변수의 이름을 가져올 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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