1 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
Go 1.18 已完全禁用字段訪問。Go 1.18 發(fā)行說明提到了這一點(diǎn):
當(dāng)前的泛型實(shí)現(xiàn)具有以下已知限制:
[...]
Go 編譯器不支持訪問類型參數(shù) type的結(jié)構(gòu)字段x.f,即使類型參數(shù)的類型集中的所有類型都有一個(gè) field。我們可能會(huì)在 Go 1.19 中刪除此限制。xf
任何 struct 類型的解決方法都?xì)w結(jié)為舊的無聊的基于接口的多態(tài)性,到目前為止我們都在使用,沒有類型參數(shù):
type Type interface {
GetA() string
}
func (s Struct) GetA() string {
return s.A
}
在這一點(diǎn)上,您甚至不必將Type接口用作約束。它可以只是一個(gè)普通的接口類型:
func PrintA(v Type) {
fmt.Printf("%s\n", v.GetA())
}
舊答案
在 2022 年初的某個(gè)時(shí)候,此功能仍在開發(fā)中,如果您添加以下內(nèi)容,您的示例確實(shí)有效~:
type Type interface {
~struct{ A string }
}
但它只適用于完全定義為的結(jié)構(gòu)struct{ A string },沒有別的。定義一個(gè)約束“表示[s]所有具有特定類型的特定字段的結(jié)構(gòu)”一直以來都不受支持。有關(guān)詳細(xì)信息,請(qǐng)參閱此答案。
相反,您從提案中引用的示例是關(guān)于訪問類型集中的公共字段。通過定義結(jié)構(gòu)的聯(lián)合:
type structField interface {
~struct { a int; x int } | ~struct { a int; x float64 }
}
您應(yīng)該能夠訪問a此類類型參數(shù)的字段,但是正如答案開頭所述,這又沒有實(shí)現(xiàn)。如果聯(lián)合中的所有術(shù)語都具有相同的基礎(chǔ)類型,它曾經(jīng)可以工作(示例改編自問題 #48522):
package main
import "fmt"
type Point struct {
X, Y int
}
type Rect struct {
X, Y int
}
func GetX[P Point | Rect] (p P) int {
return p.X
}
func main() {
p := Point{1, 2}
r := Rect{2, 3}
fmt.Println("X: %d %d", GetX(p), GetX(r)) // prints X: 1 2
}
自 2022 年 3 月起,此代碼不再編譯。
- 1 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報(bào)