首頁 >後端開發 >Golang >有沒有一種方法可以確保傳遞的值具有使用泛型的某些欄位?

有沒有一種方法可以確保傳遞的值具有使用泛型的某些欄位?

王林
王林轉載
2024-02-10 16:27:22684瀏覽

有沒有一種方法可以確保傳遞的值具有使用泛型的某些欄位?

有沒有一種方法可以確保傳遞的值具有使用泛型的某些欄位?這是許多開發者在使用泛型時常常遇到的問題。在PHP中,我們可以透過類型約束和介面實作來實現這項功能。首先,我們可以使用類型約束來確保傳遞的值是某個類別的實例。然後,我們可以使用介面來定義某些欄位的規範,確保傳遞的值具有這些欄位。這樣,我們就可以在程式碼中使用泛型,並確保傳遞的值符合特定的欄位要求。透過這種方式,我們可以更好地利用泛型的優勢,並確保程式碼的可靠性和安全性。

問題內容

我試圖在 go 中定義一個通用函數,它接受具有某些欄位的值,例如 id ​​int。我嘗試了幾種方法,但似乎都不起作用。這是我嘗試過的範例。

package main

import (
    "fmt"
)

func Print[T IDer](s T) {
    fmt.Print(s.ID)
}

func main() {
    Print(Person{3, "Test"})
}

type IDer interface {
    ~struct{ ID int }
}

type Person struct {
    ID   int
    Name string
}

type Store struct {
    ID     int
    Domain string
}

這是遊樂場連結:https://gotipplay.golang.org/p/2i4rsucwagf

在上面的範例中,我想保證傳遞給 print 函數的每個值都有一個屬性 id ​​int,該屬性也可以在函數中存取。有什麼方法可以在 go 中實現此目的,而無需在介面中定義方法(例如 getid() int)?

解決方法

有什麼方法可以在 go 中實現此目的,而無需在介面中定義方法(例如 getid() int)?

不,您必須在介面中定義方法。

go 1.18 中的泛型實作不支援結構類型,儘管原始類型參數提案建議支援。要存取聯合中的公共字段,另請參閱 這個解釋

儘管如此,我認為值得指出一個很容易從您的示例中產生的誤解:近似值~t (波形符類型)的含義意味著「基礎類型為t 的類型集。 p>

現在,當你寫:

~struct{ id int }

這意味著其基礎型別完全struct{ id int }。無論如何,這不包括具有字段 id ​​int 其他內容的結構。例如。 type foo struct { id int; 的底層型別;名稱字串}struct { id int;命名字串},而不是struct{ id int },這樣無論如何都無法滿足限制。

目前時間參數實作沒有指定部分結構類型的語法。我記得提案在介面限制中加入欄位術語(以及型別術語和方法) ),上線了:

type IDer interface {
    ID int
}

這將在不破壞波形符號 ~ 的含義的情況下實現您想要執行的操作。但這不會包含在 go 1.18 中。

以上是有沒有一種方法可以確保傳遞的值具有使用泛型的某些欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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