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

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

Go - 強(qiáng)制接口僅由方法上具有指針接收器的類型滿足?

Go - 強(qiáng)制接口僅由方法上具有指針接收器的類型滿足?

Go
臨摹微笑 2023-03-15 15:21:30
我正在對類型參數(shù)進(jìn)行一些實(shí)驗(yàn),以提出一種通用的方法來連接生成對 JSON HTTP 請求的響應(yīng)的結(jié)構(gòu)。Method結(jié)構(gòu)必須實(shí)現(xiàn)的接口有一個(gè)方法SetParams。只要實(shí)現(xiàn)使用指針接收器,這就會按預(yù)期工作。SetParams我的問題:如果有值接收者,有什么方法可以使它成為編譯時(shí)錯(cuò)誤?SetParams下面是一個(gè)示例,它演示了具有值接收者的問題:package mainimport (    "encoding/json"    "fmt"    "log")type PingParams struct {    Name string}type PingResponse struct {    Message string}func (p PingParams) Greeting() string {    if p.Name != "" {        return fmt.Sprintf("Hello, %s", p.Name)    }    return fmt.Sprintf("Hello, nobody!")}type GoodPing struct {    Params PingParams}// SetParams has a pointer receiver.func (m *GoodPing) SetParams(p PingParams) {    fmt.Printf("assign %v with pointer receiver, Good!\n", p)    m.Params = p}func (m GoodPing) Run() (*PingResponse, error) {    return &PingResponse{Message: fmt.Sprintf("%T %s", m, m.Params.Greeting())}, nil}type BadPing struct {    Params PingParams}// SetParams has a value receiver.func (m BadPing) SetParams(p PingParams) {    fmt.Printf("assign %v with value receiver, Bad!\n", p)    m.Params = p}func (m BadPing) Run() (*PingResponse, error) {    return &PingResponse{Message: fmt.Sprintf("%T %s", m, m.Params.Greeting())}, nil}type Method[M, RQ, RS any] interface {    // Run builds the RPC result.    Run() (*RS, error)    // SetParams is intended to set the request parameters in the struct implementing the RPC method.    // This then allows the request parameters to be easily available to all methods of the Method struct.    // The method MUST have a pointer receiver. This is NOT enforced at compile time.    SetParams(p RQ)    // The following line requires the implementing type is a pointer to M.    *M    // https://stackoverflow.com/a/72090807}func HandlerMethod[M, RQ, RS any, T Method[M, RQ, RS]](in json.RawMessage) (*RS, error) {    // A real implementation of this would return a func for wiring into a request router    var req RQ    err := json.Unmarshal(in, &req)    if err != nil {        return nil, err    }}https://go.dev/play/p/Eii8ADkmDxE
查看完整描述

1 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊

你不能那樣做。

在您的代碼中執(zhí)行此操作時(shí):

var m T = new(M)

即使T的類型集僅*M作為類型術(shù)語包含,*M的方法集也包含聲明在 上的方法M。編譯器無法為您檢查該方法如何*M在 的方法集中結(jié)束。

SetParam在聲明該方法時(shí),您有責(zé)任BadPing確保該方法不會嘗試無效地修改接收器。


查看完整回答
反對 回復(fù) 2023-03-15
  • 1 回答
  • 0 關(guān)注
  • 170 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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