首頁  >  文章  >  後端開發  >  使用any實例化通用接口,struct不實現它

使用any實例化通用接口,struct不實現它

WBOY
WBOY轉載
2024-02-08 22:51:08929瀏覽

使用any實例化通用接口,struct不實現它

php小編柚子在這篇文章中將為大家介紹使用any實例化通用介面的方法,並解釋為什麼struct並不實作它。通用介面是一種非常有用的設計模式,它允許我們在編寫程式碼時使用更靈活的方式。然而,在使用通用介面時,我們需要注意一些細節,以避免不必要的問題。讓我們一起來看看如何正確地使用any實例化通用接口,並了解struct為什麼不實現它。

問題內容

有人可以解釋一下,為什麼 *DataTo 不滿足 ToType[any] 嗎?

嘗試建立一個 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)
}

解決方法

因為any是靜態型別。

如果您使用它來實例化像 ToType 這樣的泛型類型,則該泛型類型將準確地期望 any

現在,類型參數的某些用法可能會隱藏此問題,例如:

type Foo[T any] struct {
    Value T
}

Foo[any]{Value: 12} // ok

通常情況下,您可以像上面那樣為any 指定任何類型,因為any 只是空介面interface{} 的別名,並且任何類型都滿足空接口。

當類型參數用於複合類型(例如*T)時,使用any 實例化意味著完全是*any #。因此,您可以將 ToType[any] 想像為相同的東西:

type ToTypeAny interface {
    SetVal()
    *any
}

然後 *DataTo 顯然不是 *any。更多詳細資訊:將結構指標指派給介面指標

#如果您如下聲明該結構,它將編譯:

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

或以更「通用」但也更詳細的方式:

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

&DTO[DataFrom, DataTo, *DataTo]{ ... }

以上是使用any實例化通用接口,struct不實現它的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除