>백엔드 개발 >Golang >여러 슬라이스가 추가될 때 Go 변수를 덮어쓰는 이유는 무엇입니까?

여러 슬라이스가 추가될 때 Go 변수를 덮어쓰는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 07:59:02281검색

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

Go 변수를 덮어쓰는 중(버그?)

이 문제는 기존 슬라이스에 요소를 추가하여 정의된 여러 변수를 설정할 때 발생합니다. , 그러나 두 번째 변수가 설정되면 변수 하나를 덮어씁니다.

다음 코드 조각을 고려하세요.

<code class="go">for i := 0; i < len(prePaths); i++ {
    route := prePaths[i]
    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(route, nextA)
    pathB := append(route, nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

문제는 루프의 두 번째 줄에 있습니다. 여기서 'pathA'와 'pathB'는 요소가 추가된 슬라이스로 정의됩니다. 그러나 슬라이스에 추가해도 새 슬라이스가 생성되지는 않습니다. 대신 기존 슬라이스를 수정합니다.

이 시나리오에서 'route'는 추가되는 기존 슬라이스입니다. 따라서 'pathA'가 생성되면 'route'와 동일한 기본 배열을 공유합니다. 이후 'pathB'가 생성되면 'pathA'와 동일한 배열도 공유합니다.

'pathB'가 추가된 마지막 슬라이스이므로 기본 배열의 마지막 요소는 추가된 값으로 설정됩니다. '경로B'로. 결과적으로 동일한 배열을 공유하는 'pathA'에도 이러한 변화가 반영됩니다. 이는 'pathB'가 설정될 때 'pathA'가 덮어쓰여지는 이유를 설명합니다.

이 문제를 해결하려면 'pathA' 및 'pathB'에 대해 독립적인 슬라이스를 생성해야 합니다. 이는 'make' 및 'copy' 기능을 사용하여 달성할 수 있습니다.

다음은 독립적인 슬라이스를 생성하는 수정된 코드 조각입니다.

<code class="go">for i := 0; i < len(prePaths); i++ {
    newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2)
    copy(newRoute, prePaths[i])

    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(newRoute, nextA)
    pathB := append(prePaths[i], nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

이 코드에서 'newRoute'는 'make' 함수를 사용하여 생성된 새로운 슬라이스는 독립적인 데이터를 가지고 있음을 보장합니다. 그런 다음 'copy' 기능을 사용하여 'prePaths[i]'에서 새 슬라이스 'newRoute'로 데이터를 복사합니다. 이후에는 'pathA'와 'pathB'를 독립적인 슬라이스를 사용하여 정의하여 초기 문제를 해결했습니다.

위 내용은 여러 슬라이스가 추가될 때 Go 변수를 덮어쓰는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.