추가 처리를 위해 채널을 통해 고루틴으로 데이터를 보내는 경우 모든 것을 처리할 수 있는 채널에 대한 욕구 유형이 자주 발생합니다. Go 1.18에 제네릭이 도입되면서 이러한 문제는 관리 가능한 것으로 보입니다. 그러나 문제가 있습니다. 초기화 시 고루틴에 채널 유형을 지정하는 것은 모든 데이터 유형을 보유할 수 있기 때문에 여전히 방해가 됩니다.
이 문제를 해결하려면 다음 샘플 코드를 고려하세요.
type Message[T any] struct { Data T } type Packet[T any] struct { Msg Message[T] } func StartController[T any](sender chan Packet[T]) { go runThread(sender) } func runThread[T any](sender chan Packet[T]) { for true { data := <-sender fmt.Println(data) } }
이 코드에서 StartController 함수는 runThread 함수를 실행하는 고루틴을 시작합니다. 그러나 인스턴스화 없이 제네릭 유형 Packet[T 인터페이스{}]을 사용하려고 시도하여 컴파일 오류가 발생합니다.
일반적인 오해는 제네릭을 사용하여 모든 유형을 수용할 수 있는 채널을 만드는 것입니다. Java의 List 예를 들어 Java의 일반 수집기 ArrayList 이 경우 채널은 모든 유형의 데이터를 받아들일 수 있습니다. 그러나 질문이 생깁니다. 일반 채널은 수신 작업을 어떻게 처리해야 합니까? 전송할 수 있는 항목이 있는 경우 수신된 항목의 데이터 유형은 무엇입니까? 따라서 가장 적합한 솔루션은 항목이 없는 코드에서 수행되는 것처럼 항목 수신 시 유형 어설션이 있는 chan 인터페이스로 남아 있습니다.{} generics. 대신, generics의 진정한 가치는 유형 안전성을 유지하면서 임의의 유형을 처리하는 코드를 작성하는 데 있습니다. 예를 들면 다음과 같습니다. 이 함수는 chan int 또는 chan 문자열을 사용하여 호출할 수 있습니다. 위 내용은 Go Generics를 사용하여 다양한 런타임 유형을 처리하는 유형 안전 채널을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!c := make(chan interface{})
func receiveAny[T any](c chan T) T {
return <-c
}