Rumah > pembangunan bahagian belakang > Golang > Fungsi generik yang menerima saluran dan kepingan

Fungsi generik yang menerima saluran dan kepingan

PHPz
Lepaskan: 2024-02-06 08:36:10
ke hadapan
825 orang telah melayarinya

Fungsi generik yang menerima saluran dan kepingan

Kandungan soalan

Saya cuba menulis fungsi generik dalam golang yang akan mencari nilai dalam kepingan dan saluran dengan cara yang sama. Berikut adalah contoh:

1

2

3

4

5

6

7

8

9

10

// minof returns the smallest number found among the channel / slice contents

func minof[t chan int | []int](input t) (result int) {

    for _, value := range input {

        if result > value {

            result = value

        }

    }

 

    return

}

Salin selepas log masuk

Tetapi saya mendapat ralat kompilasi berikut: cannot range over input(类型 t 的变量受 chan int|[]int 约束)(t 没有核心类型).

Saya cuba mencipta antara muka generik seperti ini:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

type Rangable interface {

    chan int | []int

}

 

// MinOf returns the smallest number found among the channel / slice contents

func MinOf[T Rangable](input T) (result int) {

    for _, value := range input {

        if result > value {

            result = value

        }

    }

 

    return

}

Salin selepas log masuk

Walaupun, ralat telah ditukar kepada cannot range over input(t 类型的变量受 rangable 约束)(t 没有核心类型) ia tetap pada asasnya sama...

Adakah terdapat sebarang cara untuk menyelesaikan tugasan ini menggunakan generik atau saluran dan hirisan tidak boleh "ditukar" kepada jenis teras yang sama?

Terima kasih atas sebarang cadangan dan idea!


Jawapan betul


Anda tidak boleh melakukan ini.

range Ungkapan mesti bermula dengan jenis teras. Kesatuan dengan syarat jenis yang berbeza tidak mempunyai jenis teras kerana tiada jenis asas yang biasa.

Anda juga boleh melihat secara intuitif mengapa range memerlukan jenis teras: semantik hirisan dan julat saluran adalah berbeza.

  1. Bermula pada saluran mungkin merupakan operasi menyekat, bermula pada sekeping bukan

  2. Pembolehubah lelaran adalah berbeza

1

for i, item := range someslice {}

Salin selepas log masuk

Untuk kepingan, iint 类型的索引,item ialah jenis elemen hirisan.

1

for item := range somechan {}

Salin selepas log masuk

Untuk saluran, item ialah jenis elemen chan, dan ini adalah satu-satunya pembolehubah julat yang mungkin.

Yang terbaik yang anda boleh miliki ialah suis jenis:

1

2

3

4

5

6

7

8

9

func MinOf[T any, U chan T | []T](input U) (result int) {

    switch t := any(input).(type) {

    case chan T:

        // range over chan

    case []T:

        // range over slice

    }

    return

}

Salin selepas log masuk

Tetapi sekali lagi, kelakuan fungsi ini (menyekat vs. tidak menyekat) bergantung pada jenis, dan tidak jelas kelebihan yang anda boleh perolehi dengan menggunakan generik di sini.

Atas ialah kandungan terperinci Fungsi generik yang menerima saluran dan kepingan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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