Bagaimana untuk mengulangi penyatuan kepingan yang diluluskan dalam fungsi generik? (Jenis tanpa teras T)

WBOY
Lepaskan: 2024-02-06 08:50:08
ke hadapan
357 orang telah melayarinya

如何迭代通用函数中传递的切片并集? (T无芯型)

Kandungan soalan

Saya sedang menguji generik dalam go 1.18 dan melihat contoh ini. Saya ingin mencipta semula contoh itu tetapi boleh lulus dalam kepingan int atau kepingan apungan dan dalam fungsi saya akan menjumlahkan segala-galanya dalam kepingan.

Ini adalah apabila saya menghadapi beberapa isu semasa mengulangi bahagian tersebut. Inilah yang saya cuba:

package main

import "fmt"

// numberslice constraint
type numberslice interface {
    []int64 | []float64
}

func add[n numberslice](n n) {
    // want: to range over n and print value of v 
    for _, v := range n {
        fmt.println(v)
    }
}

func main() {
    ints := []int64{1, 2}
    add(ints)
}
Salin selepas log masuk

Saya mendapat ralat:

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Salin selepas log masuk

Bagaimana saya mencapai matlamat ini?


Jawapan betul


jenis teras antara muka (termasuk kekangan antara muka) ditakrifkan seperti berikut:

Antara muka t mempunyai jenis teras jika salah satu daripada syarat berikut dipenuhi: Puas hati:

  • Terdapat satu jenisu, iaitu jenis asas semua jenis dalam set jenis t

  • Atau set jenis t mengandungi hanya jenis saluran dengan jenis elemen yang sama e, dan semua saluran terarah mempunyai arah yang sama.

Kekangan antara muka anda tidak mempunyai jenis teras kerana ia mempunyai dua jenis asas: []int64[]float64.

Jadi anda tidak boleh menggunakannya di mana jenis teras diperlukan. Terutama sekali rangemake.

Anda boleh menukar antara muka untuk memerlukan jenis primitif dan kemudian nyatakan kepingan dalam tandatangan fungsi:

// still no core type...
type number interface {
    int64 | float64
}

// ...but the argument will be instantiated with either int64 or float64
func add[n number](n []n) {
    for _, v := range n {
        fmt.println(v)
    }
}
Salin selepas log masuk

Ini juga berfungsi, tetapi lebih bertele-tele:

type NumberSlice[N int64 | float64] interface {
    // one core type []N
    ~[]N
}

func add[S NumberSlice[N], N int64 | float64](n S) {
    for _, v := range n {
        fmt.Println(v)
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mengulangi penyatuan kepingan yang diluluskan dalam fungsi generik? (Jenis tanpa teras T). 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!