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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用泛型:type *T 是指向類型參數(shù)的指針,而不是類型參數(shù)

使用泛型:type *T 是指向類型參數(shù)的指針,而不是類型參數(shù)

Go
撒科打諢 2022-11-23 10:25:19
可能是 golang 初學(xué)者的問題:)嘗試編譯下面的代碼時,我遇到了以下編譯器錯誤。我想為共享公共 ID 字段的不同類型(這里是 A 和 B)實現(xiàn)一個對象存儲。按照 DRY 的想法,我想使用泛型來實現(xiàn)商店。添加一個對象時,我想使用GS接口設(shè)置它的ID字段(當(dāng)然實際代碼要復(fù)雜一些),但是編譯器不希望我這樣做。./prog.go:29:7: item.SetId 未定義(type *T 是指向類型參數(shù)的指針,而不是類型參數(shù))./prog.go:34:24: A沒有實現(xiàn)GS(SetId方法有指針接收者)有推薦的方法來解決這個問題嗎?提前致謝??!package mainimport "fmt"type A struct {    ID      string    AMember string}type B struct {    ID      string    BMember string}type GS interface {    Id() string    SetId(string)}func (s A) Id() string      { return s.ID }func (s *A) SetId(i string) { s.ID = i }func (s B) Id() string      { return s.ID }func (s *B) SetId(i string) { s.ID = i }type MyStore[T GS] struct {    values map[string]*T}func (s *MyStore[T]) add(item *T) {    item.SetId("aa")    s.values["aa"] = item}func main() {    var storeA = &MyStore[A]{}    storeA.values = make(map[string]*A)    a := &A{}    storeA.add(a)    fmt.Println(a.Id())}
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊

關(guān)于使用 *T

簡而言之,類型參數(shù)不是它的約束。該約束僅確定 上可用的操作T,它并不暗示關(guān)于 的任何內(nèi)容*T,它現(xiàn)在只是一個未命名的指針類型。這是意義:

type *T 是指向類型參數(shù)的指針,而不是類型參數(shù)

因此,與您的情況一樣,方法集*T不會自動包含在T具體類型上聲明的指針接收器方法A,并且它不會實現(xiàn)將由 實現(xiàn)的接口*A。

您必須通過設(shè)置額外的約束將其明確告知編譯器。在簡化形式中,它類似于:

func Foo[T any, PT interface { SetId(string); *T}](v T) {}

您可以在此處找到有關(guān)此用例的更多示例和變體:

關(guān)于實施約束

&MyStore[A]{}錯誤消息清楚地報告了此實例化失敗的原因:

A沒有實現(xiàn)GS(SetId方法有指針接收者)

換句話說SetId(),聲明于*A,而不是A。因此你應(yīng)該實例MyStore*A

var storeA = &MyStore[*A]{}

然后*T將結(jié)構(gòu)/方法定義中的出現(xiàn)更改為T

type MyStore[T GS] struct {
    values map[string]T // just T instead of *T
    }
    func (s *MyStore[T]) add(item T) {
}

在使用字段類型實例化時,*A將變得等效于map[string]*A因此使分配storeA.values = make(map[string]*A)有效,并且方法簽名add(item *A)因此允許storeA.add(&A{}).

固定游樂場:https ://gotipplay.golang.org/p/dcUVJ5YQK_b


查看完整回答
反對 回復(fù) 2022-11-23
  • 1 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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