2 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
為這些類(lèi)型聲明一個(gè)公共接口。這些方法應(yīng)該反映您想要對(duì)這些值執(zhí)行的任何操作。我在這里使用 add 作為增量的概括。
type Cntr interface {
Add(i int)
}
在每種類(lèi)型上實(shí)現(xiàn)該接口:
func (a *A) Add(i int) { a.Cnt += i }
func (b *B) Add(i int) { b.Cnt += i }
聲明接口類(lèi)型的切片并使用 *A 和 *B 類(lèi)型的值:
a := &A{}
b := &B{}
list := []Cntr{ // <-- slice of the interface type
a,
b,
}
增加計(jì)數(shù)器:
for _, item := range list {
item.Add(1)
}
打印結(jié)果:
fmt.Printf("a.Cnt: %d, b.Cnt: %d", a.Cnt, b.Cnt)
// prints a.Cnt: 1, b.Cnt: 1
在程序上運(yùn)行這個(gè)操場(chǎng)。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
使用反射 API 獲取指向任意結(jié)構(gòu)類(lèi)型中命名字段的指針:
func getFieldPtr(v interface{}, name string) interface{} {
return reflect.ValueOf(v).Elem().FieldByName(name).Addr().Interface()
}
像這樣使用它:
a := &A{}
b := &B{}
list := []interface{}{
a,
b,
}
for _, item := range list {
pcnt := getFieldPtr(item, "Cnt").(*int)
*pcnt++
}
fmt.Printf("a.Cnt: %d, b.Cnt: %d", a.Cnt, b.Cnt)
https://go.dev/play/p/InVlnv37yqW
- 2 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)