Rumah > pembangunan bahagian belakang > Golang > Mengapakah Saya Tidak Boleh Menghantar `func(int)` kepada Fungsi Menjangkakan `func(antara muka{})` dalam Go?

Mengapakah Saya Tidak Boleh Menghantar `func(int)` kepada Fungsi Menjangkakan `func(antara muka{})` dalam Go?

Susan Sarandon
Lepaskan: 2024-12-23 16:09:12
asal
533 orang telah melayarinya

Why Can't I Pass a `func(int)` to a Function Expecting `func(interface{})` in Go?

Taip func dengan Parameter Antara Muka Tidak Serasi: Memahami Varian

Dalam Go, menghadapi "tidak boleh menggunakan (type func(int)) sebagai taip myfunc dalam argumen kepada ralat b" apabila menggunakan fungsi dengan parameter antara muka boleh membingungkan. Isu ini timbul disebabkan oleh konsep varians dalam sistem jenis.

Antara muka Go tidak mempamerkan varians, bermakna antara muka tidak berkelakuan secara kovarian seperti dalam beberapa bahasa pengaturcaraan lain. Apabila jenis x melaksanakan antara muka ii, ia tidak membayangkan bahawa func(x) melaksanakan func(ii).

Dalam contoh yang disediakan, ralat berlaku kerana func(int) tidak serasi dengan func(antara muka{ }), walaupun int boleh diserahkan kepada antara muka{}. Ketidakserasian ini timbul daripada fakta bahawa antara muka tidak berkelakuan secara kovarian dalam Go.

Untuk menangani isu ini, anda boleh menghantar func(int) ke dalam fungsi yang mengharapkan antara muka{}, seperti yang ditunjukkan dalam contoh 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

Ini berfungsi kerana func(int)int melaksanakan antara muka{}, dengan berkesan "melebarkan" jenis kepada antara muka yang lebih generik taip.

Untuk penjelasan lanjut, rujuk artikel Wikipedia tentang varians dan catatan blog terpaut yang meneroka varians dalam pelbagai bahasa pengaturcaraan, terutamanya bahasa yang menyokong warisan.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menghantar `func(int)` kepada Fungsi Menjangkakan `func(antara muka{})` dalam Go?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan