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 关注
- 130 浏览
添加回答
举报