首頁 >後端開發 >Golang >為什麼 Go 缺乏數組/切片協方差需要解決方法來處理不同的集合類型?

為什麼 Go 缺乏數組/切片協方差需要解決方法來處理不同的集合類型?

Patricia Arquette
Patricia Arquette原創
2024-12-24 02:52:13533瀏覽

Why Does Go's Lack of Array/Slice Covariance Require Workarounds for Handling Different Collection Types?

解決Go 中缺乏數組/切片協方差的問題

在Go 中,數組或切片協方差的缺失可能會在使用時帶來挑戰不同類型的集合。考慮以下場景:

func printItems(header string, items []interface{}, fmtString string) {
  // ...
}

func main() {
  var iarr = []int{1, 2, 3}
  var farr = []float{1.0, 2.0, 3.0}
  printItems("Integer array:", iarr, "")
  printItems("Float array:", farr, "")
}

Go 缺乏泛型,導致我們無法定義接受任何類型集合的泛型 printItems 函數。相反,我們遇到以下錯誤:

prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      
prog.go:27: cannot use farr (type []float) as type []interface { } in function argument

基於介面的解決方案

克服此限制的一種常見方法是採用定義所需行為的介面為了我們的收藏。在本例中,我們定義一個帶有兩個方法的List 接口,At(檢索特定索引處的項目)和Len(獲取列表的長度):

type List interface {
    At(i int) interface{}
    Len() int
}

然後我們創建具體的實現這個介面用於我們的整數和浮點列表:

type IntList []int
type FloatList []float64

func (il IntList)   At(i int) interface{} { return il[i] }
func (fl FloatList) At(i int) interface{} { return fl[i] }

func (il IntList)   Len() int { return len(il) }
func (fl FloatList) Len() int { return len(fl) }

有了這些實現,我們現在可以修改printItems 函數以接受List作為參數,從而允許我們列印整數和浮點數組:

import "fmt"

func printItems(header string, items List) {
    for i := 0; i < items.Len(); i++ {
        fmt.Print(items.At(i), " ")
    }
    fmt.Println()
}

在我們的主函數中,我們可以使用整數和浮點列表呼叫printItems,實現我們想要的結果:

func main() {
    var iarr = []int{1, 2, 3}
    var farr = []float64{1.0, 2.0, 3.0}
    printItems("Integer array:", IntList(iarr))
    printItems("Float array:", FloatList(farr))
}

透過利用介面儘管Go 中沒有泛型,但為了為我們的集合定義一組通用的操作,我們仍然可以實現一定程度的靈活性和程式碼可重用性。

以上是為什麼 Go 缺乏數組/切片協方差需要解決方法來處理不同的集合類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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