首頁 > 後端開發 > Golang > 在處理不同元素類型時如何處理 Go 的陣列/切片不變性?

在處理不同元素類型時如何處理 Go 的陣列/切片不變性?

Susan Sarandon
發布: 2024-12-18 01:47:10
原創
716 人瀏覽過

How to Handle Go's Array/Slice Invariance When Working with Different Element 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 缺乏陣列/切片協方差,您將遇到錯誤。具體來說:

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
登入後複製

靈活的解決方案

規避此問題的一種方法是定義一個抽象這些數組/切片的公共屬性的介面:

package main

import "fmt"

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

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

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) }

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板