Go lang slice of interface

时间:2017-02-10 12:27:12

标签: go iteration slice

我试图遍历一片接口,通过id查找我的特定结构并更改属性。

type A struct {
    ID    ID
    Steps []Step
}

type Step interface{}

type B struct {
    ID       ID
}

type C struct {
   ID     ID
}

func (s *A) findStepByID(id ID) (Step, error) {
    for index, step := range s.Steps {
        switch stepType := step.(type) {
        case A:
            if stepType.ID == id {
                return step, nil
            }
        case B:
            if stepType.ID == id {
                return step, nil
            }
        default:
            return nil, errors.New("no step found")
        }
    }
    return nil, errors.New("no step found")
}

当我找到我的结构例如B时,我会设置B.ID = xy

1 个答案:

答案 0 :(得分:1)

函数findStepByID返回interface{}。如果要为ID分配新值,则必须将其显式转换为类型

这里假设您使用案例来更新结果并使用更新的值。有两种方法可以做到这一点

  1. 而不是空接口interface{}使用定义了函数UpdateID(ID)的接口

  2. 使用类型开关和内部开关仅执行更新

  3. 我不会建议第二个,因为它有范围问题