>백엔드 개발 >Golang >Go에서 외부 패키지의 일반 멤버가 포함된 구조체를 처리하기 위한 일반 함수를 작성하는 방법은 무엇입니까?

Go에서 외부 패키지의 일반 멤버가 포함된 구조체를 처리하기 위한 일반 함수를 작성하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-27 09:49:301109검색

How to Write a Generic Function for Handling Structs with Common Members from an External Package in Go?

외부 패키지의 공통 멤버가 있는 다양한 구조체를 처리하기 위한 일반 함수

소개

공통 멤버를 공유하는 여러 구조체에서 작동하는 일반 함수 작성 특히 이러한 구조체가 외부 패키지에 속하는 경우에는 어려울 수 있습니다. 이 문서에서는 이 시나리오를 해결하기 위한 다양한 솔루션을 살펴봅니다.

문제 정의

Message 및 MulticastMessage를 포함하여 Firebase 메시지 구조에 특정 필드를 추가하는 함수를 작성하기 위한 요구 사항을 고려하세요. 두 구조체 모두 동일한 유형의 Android 및 APNS 필드를 포함하지만 서로의 관계를 명시적으로 선언하지는 않습니다.

시도 및 오류

처음에는 일반 인터페이스인 firebaseMessage를 정의하려고 시도할 수 있습니다. , 그리고 다음과 같이 함수를 구현합니다.

<code class="go">type firebaseMessage interface {
    *messaging.Message | *messaging.MulticastMessage
}

func highPriority[T firebaseMessage](message T) T {
    message.Android = &amp;messaging.AndroidConfig{...}
    ....
    return message
}</code>

그러나 이 접근 방식은 "message.Android 정의되지 않음(T 유형에는 Android 필드 또는 메서드가 없음)" 오류로 인해 실패합니다.

해결 방법 1: 유형 스위치

간단한 해결책은 유형 스위치를 사용하여 각 특정 구조체 유형을 개별적으로 처리하는 것입니다.

<code class="go">func highPriority[T firebaseMessage](message T) T {
    switch m := any(message).(type) {
    case *messaging.Message:
        setConfig(m.Android)
    case *messaging.MulticastMessage:
        setConfig(m.Android)
    }
    return message
}</code>

이 방법은 공용체의 유형 수가 제한되어 있는 경우 효과적으로 작동합니다.

해결책 2: 메서드가 있는 래퍼

공통 멤버에 액세스하는 것이 필수적인 경우 한 가지 접근 방식은 공용체의 모든 구조체에서 호출할 수 있는 공통 메서드를 사용하여 래퍼 구조체를 만드는 것입니다. 단점은 다양한 유형에 대해 여러 래퍼 구조체를 만들어야 한다는 것입니다.

<code class="go">type wrappedMessage interface {
    *MessageWrapper | *MultiCastMessageWrapper
    SetConfig(c foo.Config)
}

type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}

// same for MulticastMessageWrapper</code>

해결책 3: 반사

구조체가 많은 상황에서는 반사가 더 적절한 솔루션이 될 수 있습니다.

<code class="go">func highPriority[T firebaseMessage](message T) T {
    cfg := &amp;messaging.Android{} 
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>

이 접근 방식은 리플렉션을 사용하므로 필드의 주소 지정이 가능한지 확인하는 것이 중요합니다.

결론

특정 요구 사항에 따라 적절한 솔루션이 크게 달라질 수 있습니다. . 이 문서에서는 Go에서 이러한 시나리오를 처리하기 위한 몇 가지 실행 가능한 옵션을 제공합니다.

위 내용은 Go에서 외부 패키지의 일반 멤버가 포함된 구조체를 처리하기 위한 일반 함수를 작성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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