Rumah > pembangunan bahagian belakang > Golang > Mengapa Pergi Melaporkan Ralat Apabila Melepasi Fungsi dengan Jenis Parameter Tertentu kepada Fungsi Menerima Parameter{} Antara Muka?

Mengapa Pergi Melaporkan Ralat Apabila Melepasi Fungsi dengan Jenis Parameter Tertentu kepada Fungsi Menerima Parameter{} Antara Muka?

DDD
Lepaskan: 2024-12-25 13:03:10
asal
418 orang telah melayarinya

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

Type Func with Interface Parameter Incompatibility

Apabila mentakrifkan jenis fungsi yang menerima sebarang nilai yang mematuhi antara muka, ia mungkin mengelirukan untuk ditemui ralat semasa menggunakan fungsi yang kelihatan sepadan dengan spesifikasi itu.

Pertimbangkan perkara berikut contoh:

type myfunc func(x interface{})

func a(num int) {
    return
}

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

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
    return
}
Salin selepas log masuk

Ralat timbul kerana antara muka dalam Go mempamerkan invarian, bermakna walaupun int boleh dihantar ke fungsi yang mengharapkan antara muka{}, perkara yang sama tidak benar untuk func(int) dan func(antara muka{}).

Dalam Go, fungsi dengan jenis yang serasi mesti mempunyai parameter dan jenis pulangan yang sama. Memandangkan func(int) dan func(antara muka{}) tidak memenuhi keperluan ini, Go menganggapnya sebagai tidak serasi.

Untuk menyelesaikan isu ini, pertimbangkan untuk menggunakan pendekatan berikut:

package main

import "fmt"

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

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

func main() {
    foo(add2)
}
Salin selepas log masuk

Dalam contoh ini, func(int)int dihantar kepada antara muka fungsi yang mengharapkan{}. Ini dibenarkan kerana func(int)int melaksanakan antara muka{} yang memerlukannya mempunyai satu kaedah dengan input dan jenis pulangan yang ditentukan.

Untuk penjelasan lebih terperinci tentang varians dalam Go, rujuk artikel Wikipedia tentang subjek dan catatan blog dipautkan dalam jawapan yang disediakan.

Atas ialah kandungan terperinci Mengapa Pergi Melaporkan Ralat Apabila Melepasi Fungsi dengan Jenis Parameter Tertentu kepada Fungsi Menerima Parameter{} Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan