Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengulangi penyatuan kepingan yang diluluskan dalam fungsi generik? (Jenis tanpa teras T)

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

WBOY
WBOYke hadapan
2024-02-06 08:50:08360semak imbas

如何迭代通用函数中传递的切片并集? (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)
}

Saya mendapat ralat:

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

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

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

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!

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