>백엔드 개발 >Golang >다음은 기사의 다양한 측면을 강조하는 몇 가지 제목 옵션입니다. 문제에 집중하기: * Go 1.18에서 제네릭을 사용하여 다양한 Firebase 메시지 구조의 필드를 설정하는 방법은 무엇입니까? * 진

다음은 기사의 다양한 측면을 강조하는 몇 가지 제목 옵션입니다. 문제에 집중하기: * Go 1.18에서 제네릭을 사용하여 다양한 Firebase 메시지 구조의 필드를 설정하는 방법은 무엇입니까? * 진

Linda Hamilton
Linda Hamilton원래의
2024-10-27 20:32:01812검색

Here are a few title options, each highlighting a different aspect of the article:

Focusing on the problem:

* How to Set Fields in Different Firebase Message Structs with Generics in Go 1.18?
* Generic Function for Struct Members from External Packages:

외부 패키지의 구조체 멤버에 대한 일반 함수

특정 필드를 다양한 Firebase 메시지 구조체에 추가하기 위한 단일 함수를 만드는 목표를 생각해 보세요. 유사한 유형의 공통 필드를 공유하는 Message 및 MulticastMessage와 같습니다. 처음에 다음과 같이 유형 제약 조건을 사용하여 일반 함수 highPriority를 ​​정의하려고 시도하면 오류가 발생했습니다.

<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>

Go 1.18의 제한

Go 1.18에서 액세스 유형 매개변수의 공통 필드 또는 메소드는 지원되지 않습니다. 따라서 이 접근 방식은 실패합니다.

해결책 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)
}

// ...

func highPriority[T wrappedMessage](message T) T {
    message.SetConfig(messaging.Android{"some-value"})
    return message
}</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>

추가 참고 사항:

  • 유형 매개변수 제한 사항에 대한 자세한 내용은 [인터페이스에서 구조체 필드를 유형 제약 조건으로 정의하려면 어떻게 해야 하나요?](https://go.dev/play/p/9iG0eSep6Qo)를 참조하세요.
  • Union 제약 조건의 유형에 대한 공통 메서드 구현에 대한 자세한 내용은 [In Go 제네릭, Union 제약 조건의 유형에 대한 공통 메서드를 사용하는 방법은 무엇입니까?](https://go.dev/play/p/JUHp9Fu27Yt)를 참조하세요. ).

위 내용은 다음은 기사의 다양한 측면을 강조하는 몇 가지 제목 옵션입니다. 문제에 집중하기: * Go 1.18에서 제네릭을 사용하여 다양한 Firebase 메시지 구조의 필드를 설정하는 방법은 무엇입니까? * 진의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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