首頁 > 後端開發 > Golang > 主體

## 如何在 Go 中使用具體類型初始化介面切片?

Susan Sarandon
發布: 2024-10-25 14:01:02
原創
963 人瀏覽過

## How to Initialize Slices of Interfaces with Concrete Types in Go?

Go 中使用介面和具體類型進行泛型初始化

在 Go 中編寫泛型函數時,接受具體類型也是有益的。然而,當嘗試使用這些特定類型的新實例初始化介面切片時,這會帶來挑戰。

使用多個類型參數的初始嘗試

一種方法可能看起來合乎邏輯:定義兩個類型參數,一種用於切片元素類型(X),另一種用於要實例化的具體類型(Y)。但是,當嘗試將 Y 的實例指派給 X 類型的元素時,此方法會失敗。

<code class="go">func Fill[X, Y any](slice []X){
   for i := range slice {
      slice[i] = new(Y) // not work!
   }
}</code>
登入後複製

出現此問題的原因是編譯器遺失了介面 X 與其實作 Y 之間的關係。 X 和Y 被視為不同的任何類型。

使用明確轉換

為了解決這個問題,可以在函數中使用明確轉換操作:

<code class="go">func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}</code>
登入後複製

但是,這如果Y 未實現X,該方法會觸發恐慌,這種情況發生在嘗試將*sync.Mutex(指標類型)指派給sync.Locker 等場景。

利用建構子

更強大且型別安全的解法涉及使用建構子:

<code class="go">func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}</code>
登入後複製

此函式接受傳回指定型別的新實例的建構子。這允許使用具體類型實例簡潔、安全地初始化切片。

避免空值

在具體型別打算使用指標型別實例化的情況下,請務必注意new(Y) 將導致零值。為了避免這種情況,可以調整建構子以傳回正確的指標值,例如 func() X { return &sync.Mutex{} }.

以上是## 如何在 Go 中使用具體類型初始化介面切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!