Go가 슬라이스 유형 변환을 허용하지 않는 이유(예: []Foo에서 []Bar로)
소개
Go에서는 유형 안전성과 변환 규칙으로 인해 일반적으로 다른 유형의 변수에 하나의 값을 할당하는 것이 허용되지 않습니다. 발견한 바와 같이, 한 유형의 구조 조각(예: []Foo)을 다른 유형의 조각(예: []Bar)으로 변환할 수 없습니다. 이 글의 목적은 Foo와 Bar의 기본 유형이 동일하더라도 이 변환이 불가능한 이유를 명확히 하는 것입니다.
변환 규칙
Go 사양에 따름 , 상수가 아닌 값 x는 다음 기준 중 하나가 충족되는 경우에만 T 유형으로 변환될 수 있습니다.
슬라이스의 기본 유형
슬라이스의 기본 유형은 요소 유형에 대한 포인터입니다. 예를 들어, []Foo의 기본 유형은 []Foo이고, []Bar의 기본 유형은 []Bar입니다. Foo의 기본 유형이 Bar의 기본 유형과 동일하더라도 이는 Foo 및 Bar 조각의 동일한 기본 유형으로 변환되지 않습니다.
비변환 이유
따라서 Go가 기본 유형이 동일하더라도 요소 유형이 다른 슬라이스 간의 변환을 허용하지 않는 이유는 슬라이스의 기본 유형이 동일하지 않기 때문입니다. 따라서 []Bar(foos)와 같은 유형 변환은 허용되지 않습니다.
대체 솔루션
이 문제에 대한 한 가지 가능한 솔루션은 다음을 정의하는 것입니다. Foos와 같은 Foo 조각에 대한 사용자 정의 유형 별칭입니다. 이를 통해 다음 코드에 설명된 대로 Foos 조각에서 Bar 조각을 생성할 수 있습니다.
<code class="go">type Foo struct{ A int } type Foos []Foo type Bars Foos func main() { foos := []Foo{Foo{1}, Foo{2}} bars := Bars(foos) fmt.Println(bars) }</code>
이 경우 Foos와 Bars의 기본 유형은 동일하며 변환은 다음과 같이 작동합니다. 예상됩니다.
안전하지 않은 패키지 고려 사항
Go는 일반적으로 안전하지 않은 작업을 금지하지만 안전하지 않은 패키지를 사용하여 변환 제한을 우회할 수 있습니다. 그러나 이는 유형 안전성을 손상시킬 수 있으므로 잠재적인 결과를 주의 깊게 이해하고 수행해야 합니다.
결론
변환 규칙과 기본 슬라이스 유형을 이해하는 것은 Go에서 유형 변환을 처리하는 데 중요합니다. 서로 다른 요소 유형의 슬라이스 간 직접 변환은 허용되지 않지만 유형 안전성을 유지하면서 원하는 기능을 달성하기 위한 사용자 정의 유형 별칭 정의와 같은 대체 솔루션이 있습니다.
위 내용은 왜 Go에서 `Foo` 조각을 `Bar` 조각으로 변환할 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!