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

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

無法將未類型化的 int 分配給通用結(jié)構字段

無法將未類型化的 int 分配給通用結(jié)構字段

Go
繁花不似錦 2023-02-14 15:26:50
給定一個通用結(jié)構:type R2[IDTYPE comparable] struct {     ID        IDTYPE     IsActive  bool}實現(xiàn)接口:type Storable interface {     Store(ctx context.Context) error}我希望以下定義有效:func (r R2[int]) Store(ctx context.Context) error {     r.ID = 123 // not allowed     // ...     return nil}但是,方法定義是不允許的。錯誤是:'123' (type untyped int) cannot be represented by the type IDTYPE (int)在 Go 中還不能進行這種通用字段分配嗎?附錄:在游樂場上,錯誤是:cannot use 123 (untyped int constant) as int value in assignment并轉(zhuǎn)換為int(123)不起作用。這種情況下的錯誤是:cannot use comparable(123) (untyped int constant 123) as int value in assignment
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經(jīng)驗 獲得超11個贊

實例化必須發(fā)生在類型級別,而不是方法級別,并且方法不能引入新的類型參數(shù),請參閱如何在 Go 中創(chuàng)建泛型方法?(方法必須沒有類型參數(shù))

這意味著當你想使用 時R2,你必須為類型參數(shù)選擇類型參數(shù),而方法不能改變這些,你會“卡住”你在實例化時選擇的類型R2。

另請注意,由于 for 的約束IDTYPEcomparable,例如string,整數(shù)123不能在所有情況下分配給該ID字段,因為它可能具有類型string

如果您想要/必須為 ID 處理多個具體類型,泛型不是正確的選擇。可以改用接口:

type R2 struct {

    ID       any

    IsActive bool

}

另請注意,如果您希望修改接收器(例如結(jié)構的字段),則接收器必須是指針。


ID如果您希望限制存儲在to中的值comparable,請為其使用(通用)函數(shù)。


以下是您的操作方法:


type R2 struct {

    ID       any

    IsActive bool

}


func (r *R2) Store(ctx context.Context) error {

    setID(r, 123)

    return nil

}


func setID[ID comparable](r *R2, id ID) {

    r.ID = id

}

測試它:


r := &R2{}

var s Storable = r


s.Store(context.TODO())


fmt.Println(r)

哪些輸出(在Go Playground上嘗試):


&{123 false}

ID這提供了靈活性(您可以使用為字段設置任何可比較的值setID()),并提供編譯時安全性:嘗試設置不可比較的值將導致編譯時錯誤,例如:


setID(r, []int{1}) // Error: []int does not implement comparable


查看完整回答
反對 回復 2023-02-14
  • 1 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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