首頁  >  文章  >  後端開發  >  為什麼我不能在 Go 中將 `Foo` 的切片轉換為 `Bar` 的切片?

為什麼我不能在 Go 中將 `Foo` 的切片轉換為 `Bar` 的切片?

Susan Sarandon
Susan Sarandon原創
2024-10-26 10:03:02117瀏覽

Why Can't I Convert a Slice of `Foo` to a Slice of `Bar` in Go?

為什麼Go 不允許切片型別轉換(例如[]Foo 到[]Bar)

簡介

簡介

簡介

  • 簡介
  • 在Go 中,由於型別安全和轉換規則,通常不允許將一個值指派給不同類型的變數。正如您所發現的,您無法將一種類型的結構切片(例如 []Foo)轉換為不同類型的切片(例如 []Bar)。本文旨在闡明為什麼這種轉換是不可能的,即使 Foo 和 Bar 的底層類型可能相同。
  • 轉換規則
  • 根據Go 規範,只有滿足以下條件之一,非常量值x 才能轉換為類型T:
x 可分配給T。

x 和的基礎類型T 是相同的。

x 和 T 是具有相同基底類型的未命名指標類型。

x 和 T 都是整數、浮點或複數型。

x是整數或位元組/符文切片,T 是字串型。

x 是字串,T 是位元組/符文切片。

切片的底層類型

切片的底層類型是指向元素類型的指標。例如,[]Foo 的底層型別是

[]Foo,[]Bar 的底層型別是

[]Bar。即使 Foo 的基礎類型與 Bar 的基礎類型相同,這也不會轉換為 Foo 和 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>

未轉換的原因

因此,Go 不允許不同元素類型的切片之間進行轉換,即使底層類型相同,原因是切片的底層類型不相同。因此,不允許進行類型轉換,例如 []Bar(foos)。

替代解決方案

此問題的一個可能的解決方案是定義Foo 切片的自訂類型別名,例如 Foos。這允許您從Foos 切片建立Bars 切片,如下列程式碼所示:

在這種情況下,Foos 和Bars 的基礎類型是相同的,並且轉換工作如下

不安全包注意事項雖然Go 通常禁止不安全操作,但可以使用不安全包來繞過轉換限制。但是,應謹慎執行此操作並了解潛在後果,因為它可能會損害類型安全。 結論了解切片的轉換規則和底層類型對於處理 Go 中的類型轉換至關重要。雖然不同元素類型的切片之間不允許直接轉換,但也有替代解決方案,例如定義自訂類型別名,以在保持類型安全的同時實現所需的功能。

以上是為什麼我不能在 Go 中將 `Foo` 的切片轉換為 `Bar` 的切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn