我正在嘗試在 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,它也可以在函式中訪問。有沒有什么方法可以在沒有在介面中定義方法(例如,GetID() int)的情況下實作這一點?
uj5u.com熱心網友回復:
有沒有什么方法可以在沒有在介面中定義方法(例如,GetID() int)的情況下實作這一點?
不,您必須在介面中定義方法。
Go 1.18 中的泛型實作不支持結構型別,盡管最初的型別引數提案建議支持。我已經在這里寫了更全面的解釋。
雖然,我認為值得指出一個很容易從您的示例中產生的誤解:近似值~T(波浪號型別)的含義是“基礎型別為 T 的型別集。
現在,當你寫:
~struct{ ID int }
這意味著其基礎型別正好是 struct{ ID int }. 無論如何,這不包括具有欄位ID int 和其他內容的結構。例如,type Foo struct { ID int; Name string }isstruct { ID int; Name string }和 not的基礎型別struct{ ID int },因此無論如何都不會滿足約束。
當前時間引數實作沒有指定部分結構型別的語法。我記得一個提議在介面約束中添加欄位術語(以及型別術語和方法),就行了:
type IDer interface {
ID int
}
這將使您能夠在不破壞波浪號的含義的情況下嘗試做的事情~。但這不會包含在 Go 1.18 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438846.html
