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中文網其他相關文章!