第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在接口約束中定義結(jié)構(gòu)字段(類型 T 沒有字段或方法)?

如何在接口約束中定義結(jié)構(gòu)字段(類型 T 沒有字段或方法)?

Go
慕田峪4524236 2022-10-17 19:33:53
我想讓下面的代碼編譯。我從閱讀 Type Parameters Proposal (Go Generics) 的理解是這應(yīng)該可行,但我必須遺漏一些東西。package mainimport "fmt"func main() {    s := Struct{A: "Hello World!"}    PrintA(s)}func PrintA[T Type](v T) {    fmt.Printf("%s\n", v.A)}type Type interface {    struct{ A string }}type Struct struct {    A string}func (s Struct) String() string {    return s.A}我得到的錯(cuò)誤是:./prog.go:7:8: Struct 沒有實(shí)現(xiàn) Type (可能缺少 ~ for struct{A string} in constraint Type) ./prog.go:11:23: vA undefined (interface Type沒有方法A)我想T用特定類型的特定字段表示所有結(jié)構(gòu)。添加~沒有幫助。這是提案中的一個(gè)示例,該示例已實(shí)施并且是最新的 Go beta 版本的一部分。type structField interface {    struct { a int; x int } |        struct { b int; x float64 } |        struct { c int; x uint64 }}https://go.dev/play/p/KZh2swZuD2m?v=gotip
查看完整描述

1 回答

?
夢(mèng)里花落0921

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 月起,此代碼不再編譯。


查看完整回答
反對(duì) 回復(fù) 2022-10-17
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)