首頁 > 後端開發 > Golang > 為什麼 Go 的型別系統在傳遞帶有介面參數的函數時會產生「不相容錯誤」?

為什麼 Go 的型別系統在傳遞帶有介面參數的函數時會產生「不相容錯誤」?

Linda Hamilton
發布: 2025-01-01 12:21:10
原創
467 人瀏覽過

Why Does Go's Type System Produce

類型func 出現介面參數不相容錯誤

問題:
呼叫作為參數傳遞的函數時對於採用符合interface{} 的值的類型func,會遇到錯誤。例如,在以下程式碼中:

type myfunc func(x interface{})

func a(num int) {
}

func b(f myfunc) {
    f(2)
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
}
登入後複製

解釋:
此錯誤源自於 Go 的型別系統缺乏對其差異的支持。變異數是指在參數參數中使用子類型和超類型的靈活性。與其他類型系統不同,Go 的介面不支援方差。

在給定的範例中,雖然 int 可以傳遞給接受 interface{} 的函數,但這並不能擴展到相容 func(int)與 func(interface{}) 一起使用。這是因為 Go 中的介面不是協變的。

解決方案:
作為一種解決方法,可以透過匿名函數實作interface{} 來將函數傳遞給需要interface{} 的函數:

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(func(n int) int {
        return n + 2
    })
}
登入後複製

這種方法利用了func(int)int 確實實作的事實介面{}。

要進一步了解程式語言的方差,請考慮瀏覽維基百科文章和下面鏈接的帖子:

  • [方差(計算機科學)](https:/ /en.wikipedia .org/wiki/Variance_(computer_science))
  • [通用變異數程式設計](https://www. Fluentcpp.com/2018/11/29/variance-in-generic-programming/)

以上是為什麼 Go 的型別系統在傳遞帶有介面參數的函數時會產生「不相容錯誤」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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