Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya

WBOY
Lepaskan: 2024-02-08 22:51:08
ke hadapan
947 orang telah melayarinya

Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya

Dalam artikel ini, editor PHP Youzi akan memperkenalkan anda kepada kaedah menggunakan mana-mana untuk membuat instantiate antara muka universal, dan menerangkan sebab struct tidak melaksanakannya. Antara muka generik ialah corak reka bentuk yang sangat berguna yang membolehkan kami menggunakan cara yang lebih fleksibel semasa menulis kod. Walau bagaimanapun, apabila menggunakan antara muka biasa, kita perlu memberi perhatian kepada beberapa butiran untuk mengelakkan masalah yang tidak perlu. Mari kita lihat cara membuat instantiate antara muka generik dengan betul menggunakan mana-mana dan fahami sebab struct tidak melaksanakannya.

Kandungan soalan

Bolehkah seseorang menerangkan mengapa *DataTo 不满足 ToType[any]?

Cuba bina satu DTOer,将一个结构的所有值复制到另一个结构,并设置一些显式值(在本例中为 V)

https://go.dev/play/p/-oobZrw5Ewe

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

type DataFrom struct {
    V1 int
}

type DataTo struct {
    V int
}

func (m *DataTo) SetVal() {
    m.V = 1
    return
}

type ToType[T any] interface {
    SetVal()
    *T
}

type DTO[TFrom any, TTo ToType[any]] struct {
    Get func(from TFrom) TTo
}

func main() {
    dto := &DTO[DataFrom, *DataTo]{
        Get: func(from DataFrom) *DataTo {
            return &DataTo{V: from.V1 + 666}
        },
    }

    vFrom := DataFrom{V1: 1}
    vTo := dto.Get(vFrom)

    fmt.Println(vTo.V)
}
Salin selepas log masuk

Penyelesaian

keranaany adalah jenis statik.

Jika anda menggunakan ini untuk membuat contoh jenis generik seperti ToType, jenis generik akan menjangkakan dengan tepat ToType 这样的泛型类型,则该泛型类型将准确地期望 any.

Kini, penggunaan parameter jenis tertentu mungkin menyembunyikan isu ini, contohnya:

type Foo[T any] struct {
    Value T
}

Foo[any]{Value: 12} // ok
Salin selepas log masuk

Biasanya, anda boleh menentukan apa-apa jenis untuk any 指定任何类型,因为 any 只是空接口 interface{} seperti di atas, kerana

hanyalah alias untuk antara muka antara muka{} kosong dan sebarang jenis memenuhi antara muka kosong.

*T)时,使用 any 实例化意味着完全是 *any。因此,您可以将 ToType[any]Apabila parameter jenis digunakan untuk jenis komposit (cth. *T), instantiasi menggunakan

bermaksud

tepat *mana-mana*DataTo 显然不是 *any. Jadi anda boleh menganggap ToType[any] sebagai perkara yang sama:

Kemudian

. Butiran lanjut:

Menetapkan penunjuk struktur kepada penunjuk antara muka

Jika anda mengisytiharkan struct seperti berikut, ia akan menyusun: 🎜
type DTO[TFrom any, TTo ToType[DataTo]] struct {
    Get func(from TFrom) TTo
}
Salin selepas log masuk
🎜Atau dengan cara yang lebih "generik" tetapi juga lebih terperinci: 🎜
type DTO[TFrom any, T any, TTo ToType[T]] struct {
    Get func(from TFrom) TTo
}

&DTO[DataFrom, DataTo, *DataTo]{ ... }
Salin selepas log masuk

Atas ialah kandungan terperinci Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!