亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將各種結構放入列表并進行操作?

如何將各種結構放入列表并進行操作?

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 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號