>백엔드 개발 >Golang >Go에서 일반 유형 포인터를 특정 인터페이스로 안전하게 변환하는 방법은 무엇입니까?

Go에서 일반 유형 포인터를 특정 인터페이스로 안전하게 변환하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 16:57:22554검색

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

일반 유형 매개변수를 특정 유형으로 변환할 수 없습니다

Go에서는 제네릭을 사용할 때 제네릭 유형 매개변수와 일반 유형 매개변수 간의 관계를 이해하는 것이 중요합니다. 그들의 제약. 이 경우 문제는 일반 유형 매개변수(*T)에 대한 포인터를 특정 인터페이스(스트링거)를 기대하는 함수에 대한 인수로 전달하려고 시도하는 데서 발생합니다.

오류 메시지에서는 *T 유형 매개변수에 대한 포인터이지만 스트링거 인터페이스를 구현하지 않습니다. 이는 T(FooBar)의 제약조건과 스트링거 인터페이스가 본질적으로 연결되어 있지 않기 때문입니다. 이 문제를 해결하려면 둘 사이의 관계를 설정해야 합니다.

해결책 1: 형식 안전성 주장(안전하지 않음)

한 가지 해결책은 *T가 다음과 같다고 주장하는 것입니다. any()를 사용하는 스트링거. 이를 통해 포인터를 인수로 전달할 수 있지만 유형 안전성이 희생되고 런타임 패닉이 발생할 수 있습니다.

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}

해결책 2: FooBar 매개변수화(유형 안전)

또 다른 해결책은 FooBar 인터페이스를 일반 유형 T로 매개변수화하여 FooBar의 유형 매개변수와 전달하는 유형 매개변수가 어쩌구 일치. 이 접근 방식은 유형 안전성을 유지하고 스트링거 인터페이스를 구현하는 특정 유형에 포인터를 전달할 수 있게 해줍니다.

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

설명:

  • T의 제약 조건 이제 foo 또는 bar이고 FooBar는 T로 매개변수화됩니다.
  • 특정 항목에 대한 포인터를 생성할 수 있습니다. 유형(예: *foo)을 blah에 전달하면 해당 유형으로 FooBar가 인스턴스화됩니다.
  • U와 T에 대한 포인터가 동일한 유형 세트를 갖기 때문에 이제 U(&t) 변환이 유효합니다.

이 솔루션을 사용하면 스트링거 인터페이스를 구현하는 특정 유형의 인스턴스를 전달하고 인스턴스화 중에 유형 안전성을 보장할 수 있습니다.

위 내용은 Go에서 일반 유형 포인터를 특정 인터페이스로 안전하게 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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