为了账号安全,请及时绑定邮箱和手机立即绑定

如何将各种结构放入列表并进行操作?

如何将各种结构放入列表并进行操作?

Go
三国纷争 2022-10-17 15:42:31
我想以编程方式操作具有相同名称和类型的各种结构字段,如下所示,但我不知道如何将不同的结构放入列表中。package mainimport "fmt"type A struct {    Cnt int}type B struct {    Cnt int}func main() {    a := &A{}    b := &B{}    list := []something{        a,        b,    }    for _, item := range list {        item.Cnt++    }    fmt.Printf("a.Cnt: %d, b.Cnt: %d", a.Cnt, b.Cnt)}
查看完整描述

2 回答

?
MMMHUHU

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

在程序上运行这个操场。


查看完整回答
反对 回复 2022-10-17
?
神不在的星期二

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


查看完整回答
反对 回复 2022-10-17
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信