無法轉換不同類型的切片(如提供的程式碼片段所示)是由於特定類型轉換造成的Go 規格中概述的規則。這些規則控制何時可以將非常量值轉換為特定類型。
任何轉換規則都不適用於您嘗試將 Bar 切片轉換為 Foo 切片的情況。雖然 Foo 和 Bar 的底層類型相同,但它們各自切片的底層類型卻不同。這導致無法將 []Foo 值指派給 []Bar 類型的變數。
了解底層類型
需要注意的是,底層類型變數的類型不一定與變數本身的類型相同。對於切片,元素類型是基礎類型。因此,雖然 Foo 和 Bar 具有相同的底層類型 (Foo),但 []Foo 和 []Bar 卻沒有。
實用解決方案
解決此問題,您可以建立一個中間類型,將 Bar 別名為 Foo。這種方法之所以有效,是因為切片的元素類型保持不變。例如:
<code class="go">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) }</code>
輸出:
[{1} {2}]
此解決方案建立具有相同基礎元素類型的切片,允許它們之間的轉換。
不安全注意事項
需要注意的是,雖然在技術上可以使用不安全操作將Foo 的切片「查看」為Bar 的切片,但這種方法規避了類型安全。為了安全性和可靠性,建議使用上面概述的類型別名方法。
以上是為什麼 Go 中不能轉換不同類型的切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!