我有这个代码

package main

import (
    "fmt"
)

type foo struct {
    a int
    b bool
}

type foos []foo

type bar struct {
    foos
}

func newBar() *bar {
    b := &bar{
        foos: make([]foo, 3, 3),
    }
    for _, foo := range b.foos {
        // didn't set b to true
        foo.b = true
    }
    return b
}

func main() {
    b := newBar()
    fmt.Println(b)
    // set b to true
    b.foos[0].b = true
    fmt.Println(b)
}

The Go Playground

如您所见,我想使用构造函数bar初始化newBar(),但我希望将嵌入类型foo.b初始化为非零值,因此我使用for range语句进行了初始化,但是foo.b仍然为假,所有其中。作为在主函数中使用此代码b.foos[0].b = true的比较,它可以正常工作。那么我的代码有什么问题呢?

最佳答案

天哪,我在发布此问题后才意识到这一点,这是因为变量slotfor loop的本地变量。所以解决方案是:

for i, _ := range b.foos {
    // now b is set to true
    b.foos[i].b = true
}

关于go - 包含嵌入式结构片段的结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49610015/

10-12 04:33