2 回答

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

TA貢獻1963條經驗 獲得超6個贊
使用反射 API 獲取指向任意結構類型中命名字段的指針:
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 關注
- 166 瀏覽
添加回答
舉報