可能是一個golang初學者的問題:)
嘗試編譯下面的代碼時,我面臨以下編譯器錯誤。
我想為共享公共 ID 欄位的不同型別(此處為 A 和 B)實作物件存盤。遵循 DRY 的想法,我想使用泛型來實作商店。
添加物件時,我想使用 GS 介面設定其 ID 欄位(實際代碼當然要復雜一些),但編譯器不希望我這樣做。
./prog.go:29:7: item.SetId undefined (type *T 是指向型別引數的指標,不是型別引數)
./prog.go:34:24: A 沒有實作 GS(SetId 方法有指標接收器)
有沒有推薦的方法來解決這個問題?提前致謝!!
package main
import "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())
}
uj5u.com熱心網友回復:
&MyStore[A]{}錯誤訊息清楚地報告了此實體化失敗的原因:
A 沒有實作 GS(SetId 方法有指標接收器)
換句話說,SetId()是宣告在*A,而不是A。因此,您應該實體MyStore化*A:
var storeA = &MyStore[*A]{}
然后*T將結構/方法定義中的出現更改為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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443003.html
上一篇:golang結構沒有實作介面?
