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.
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!