Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya

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

WBOY
WBOYke hadapan
2024-02-08 22:51:08965semak imbas

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

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

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:

type ToTypeAny interface {
    SetVal()
    *any
}
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
}
🎜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]{ ... }

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!

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