메서드 매개변수의 이름 가져오기
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!