英文:
Go lang slice of interface
问题
我正在尝试迭代接口的切片,通过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("未找到步骤")
}
}
return nil, errors.New("未找到步骤")
}
当我找到我的结构体,例如 B
,然后我将设置 B.ID = xy
。
英文:
I am trying to iterate over a slice of interfaces to find my specific struct by id and change the attribute.
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")
}
When I found my struct for example B
then I will set B.ID = xy
答案1
得分: 1
函数findStepByID
返回一个interface{}
类型。如果你想给ID赋一个新值,你必须显式地将其转换为某种类型。
假设你使用的是原样例来更新结果并使用更新后的值,有两种方法可以实现:
-
不要使用空接口
interface{}
,而是使用一个带有定义了UpdateID(ID)
函数的接口。 -
使用类型切换,在切换内部进行更新操作。
我不建议使用第二种方法,因为它存在作用域问题。
英文:
The function findStepByID
returns an interface{}
.If you want to assign ID with a new value you have to explicitly cast it to a type
Here assuming you use case as is to update the result and use updated value.There are two ways you may do it
-
Instead of a empty interface
interface{}
use a interface with functionUpdateID(ID)
defined -
Use a type switch and inside switch only do the update
I would not suggest second one as it has scope problems
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论