無法轉換不同類型的切片(如提供的程式碼片段所示)是由於特定類型轉換造成的Go 規範中概述的規則。這些規則控制何時可以將非常量值轉換為特定類型。
沒有任何轉換規則適用於您嘗試將 Bar 切片轉換為 Foo 切片的情況。雖然 Foo 和 Bar 的底層類型相同,但它們各自切片的底層類型卻不同。這導致無法將 []Foo 值指派給 []Bar 類型的變數。
理解底層類型
重要的是要注意底層類型變數的類型不一定與變數本身的類型相同。對於切片,元素類型是基礎類型。因此,雖然 Foo 和 Bar 具有相同的基礎類型 (Foo),但 []Foo 和 []Bar 卻沒有。
實用解決方案
解決此問題,您可以建立一個中間類型,將 Bar 別名為 Foo。這種方法之所以有效,是因為切片的元素類型保持不變。例如:
type Foo struct { A int }
type Bar Foo
type Foos []Foo
type Bars Foos
func main() {
foos := []Foo{Foo{1}, Foo{2}}
bars := Bars(foos)
fmt.Println(bars)
}
輸出:
[{1} {2}]
此解決方案建立具有相同基礎元素類型的切片,允許它們之間的轉換。
不安全注意事項
需要注意的是,雖然在技術上可以使用不安全操作將Foo 的切片“查看”為Bar 的切片,但這種方法規避了類型安全。為了安全性和可靠性,建議使用上面概述的類型別名方法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3