Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Go generik gagal apabila fungsi mengembalikan fungsi?

Mengapakah Go generik gagal apabila fungsi mengembalikan fungsi?

王林
王林ke hadapan
2024-02-05 21:33:11435semak imbas

为什么当函数返回一个函数时 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)
    }
}

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

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

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam