2017-10-10 74 views
0

考虑这一段代码的:追加值到切片的切片

func main() { 
    items := func1() 

    for _, v := range items { 
     v.Status = append(v.Status, false) 
    } 

    fmt.Println(items) 

} 

//TestCaseItem represents the test case 
type TestCaseItem struct { 
    Actual []string 
    Expected []string 
    Status []bool 
} 

func func1() []TestCaseItem { 
    var tc = make([]TestCaseItem, 0) 

    var item = &TestCaseItem{} 
    item.Actual = append(item.Actual, "test1") 
    item.Actual = append(item.Actual, "test2") 

    tc = append(tc, *item) 

    return tc 
} 

我有类型TestCaseItem结构的片。在那个结构中我有一些字符串和布尔属性。首先我调用func1函数来获取一些数据,然后迭代该切片并尝试在内部追加更多数据,但此代码的输出是[{[test1 test2] [] []}]布尔值在哪里?

我觉得问题是[]TestCaseItem因为它是一个容纳值而不是指针的切片,也许我会想念某事。有人可以解释这一点吗?

回答

0

您正在将bool值附加到TestCaseItems的副本。

你要么需要使用一个指向项目:

func func1() []*TestCaseItem { 
    var tc = make([]*TestCaseItem, 0) 

    var item = &TestCaseItem{} 
    item.Actual = append(item.Actual, "test1") 
    item.Actual = append(item.Actual, "test2") 

    tc = append(tc, item) 

    return tc 
} 

,或者您需要追加到TestCaseItem值是在切片的Status领域。

for i := range items { 
    items[i].Status = append(items[i].Status, false) 
} 
+0

是的,这是真的,但所有这些都是切片,据我所知切片是对底层数组的引用,但在这种情况下,他们不引用这是为什么? – afrikaan

+0

@kyur:它与片本身中的指针没有任何关系,您正在复制'TestCaseItem'值,这意味着您没有写入相同的片值。 – JimB