Mengapakah Go generik gagal apabila fungsi mengembalikan fungsi?

王林
Lepaskan: 2024-02-05 21:33:11
ke hadapan
492 orang telah melayarinya

为什么当函数返回一个函数时 Go 泛型会失败?

Kandungan soalan

Saya baru mula bereksperimen dengan generik semasa dalam perjalanan dan menghadapi situasi di mana saya tidak faham sepenuhnya mengapa ia gagal.

Saya memfaktorkan semula fungsi berikut:

func positivepercentageabove(above int) func(list []uint8) bool {
    return func(list []uint8) bool {
        acum := 0
        for _, x := range list {
            acum += int(x)
        }
        return (float64(acum) / float64(len(list)) * 100) >= float64(above)
    }
}
Salin selepas log masuk

Masuk di sini:

func positivepercentageabove[t constraints.integer](above int) func(list []t) bool {
    return func(list []t) bool {
        acum := 0
        for _, x := range list {
            acum += int(x)
        }
        return (float64(acum) / float64(len(list)) * 100) >= float64(above)
    }
}
Salin selepas log masuk

Ujian unit untuk fungsi ini gagal dengan ralat: tests/utils/numberutils_test.go:82:50: 无法推断 t . Sumber:

func Test_TruePercentageAbove(t *testing.T) {
    tables := []struct {
        percentage int
        list       []uint8
        output     bool
    }{
        {percentage: 100, list: []uint8{1, 1, 1, 1}, output: true},
        {percentage: 100, list: []uint8{1, 1, 0, 1}, output: false},
        {percentage: 80, list: []uint8{1, 1, 1, 1, 0}, output: true},
        {percentage: 90, list: []uint8{1, 1, 1, 1, 0}, output: false},
        {percentage: 100, list: []uint8{1, 1, 1, 1, 0}, output: false},
        {percentage: 40, list: []uint8{0, 1, 0, 1, 0, 1}, output: true},
        {percentage: 60, list: []uint8{0, 1, 0, 1, 0, 1}, output: false},
        {percentage: 70, list: []uint8{0, 1, 0, 1, 0, 1}, output: false},
    }

    for _, table := range tables {
        result := utils.PositivePercentageAbove(table.percentage)(table.list)

        if result != table.output {
            t.Errorf("Slice %v with percentage above %v expected to return %v but returned %v", table.list, table.percentage, table.output, result)
        }
    }
}
Salin selepas log masuk

Saya telah menukar fungsi yang serupa daripada int kepada generik dan saya tidak pasti mengapa fungsi ini secara khusus tidak berfungsi. Saya fikir ia mungkin ada kaitan dengan fungsi yang mengembalikan fungsi lain, tetapi saya tidak dapat mengetahui sebabnya. terima kasih.


Jawapan Betul


Biasanya, jawapannya terletak pada Proposal Parameter Jenis:

Satu-satunya parameter jenis yang boleh disimpulkan ialah yang digunakan untuk jenis parameter input fungsi (bukan jenis). Jika terdapat parameter jenis yang digunakan hanya untuk jenis parameter hasil fungsi, atau hanya untuk badan fungsi, anda tidak boleh menggunakan inferens jenis parameter fungsi untuk membuat kesimpulan parameter jenis tersebut.

Jika ya

func PositivePercentageAbove[T constraints.Integer](above int) func(list []T) bool
Salin selepas log masuk

Oleh kerana parameter jenis t tidak muncul dalam senarai parameter, parameter jenis yang sepadan tidak boleh disimpulkan.

Atas ialah kandungan terperinci Mengapakah Go generik gagal apabila fungsi mengembalikan fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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