2017-10-10 5 views
0

코드의이 부분을 고려 슬라이스의 슬라이스 :APPEND 값은

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 구조체의 조각이있다. 해당 구조체에서 문자열 및 bool 속성 조각이 있습니다. 먼저 func1 함수를 호출하여 일부 데이터를 가져온 다음 해당 슬라이스를 반복하고 더 많은 데이터를 추가하려고 시도하지만이 코드의 출력은 [{[test1 test2] [] []}] 어디입니까?

내가 문제라고 느낀다 []TestCaseItem 사촌 포인터 대신 값을 보유하고 아마도 sth가 그리울 것입니다. 아무도 이것을 설명 할 수 있습니까?

답변

0

bool 값을 TestCaseItem 사본에 추가합니다.

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