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

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

WBOY
發布: 2024-02-08 22:51:08
轉載
980 人瀏覽過

使用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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板