Go에서 추가의 이상한 동작

王林
풀어 주다: 2024-02-02 14:13:26
앞으로
1024명이 탐색했습니다.

Go 中追加的奇怪行为

질문 내용

Go를 사용하여 LeetCode의 하위 집합 문제를 해결하려고 합니다. 나는 다음과 같은 해결책을 생각해냈습니다:

으아아아

그러나 이 해결책은 올바르지 않습니다. sol=append(sol,temp) 대신에append(sol,append([]int{},temp...))를 사용해야 한다는 것을 알았습니다.

fmt.Println(temp,append([]int{}, temp...)) 문이 temp 및append([]int{}, temp...)에 대해 동일한 출력을 생성하더라도,append([ ]int {}, temp...) 실제로 작동합니다. 이 경우 임시와 추가([]int{}, temp...)의 차이점을 설명할 수 있는 사람이 있나요? 수정된 버전은 작동하지만 초기 버전은 작동하지 않는 이유는 무엇입니까?

tempappend([]int{},temp...)는 동일할 것으로 예상됩니다tempappend([]int{},temp...) 相同


正确答案


sol =append(sol, temp) 的问题是您将切片 temp 添加到 sol

정답

sol =append(sol, temp)의 문제점은 슬라이스 대신 soltemp 슬라이스를 추가한다는 것입니다. 슬라이스 "내부" 항목입니다.

Slice 내부 블로그 게시물temp 在每次迭代中重用,因此 temp 切片下的数组内容将被覆盖,并且您之前添加到 sol 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println 语句显示在附加之前, temp에서 언급했듯이 슬라이스는 배열의 길이와 용량에 대한 포인터일 뿐입니다.

따라서 귀하의 경우에는 append([]int{}, temp...)의 값이 정확합니다.

🎜 🎜 새 슬라이스를 생성하면 새 슬라이스 내의 값은 재사용되지 않으므로 변경할 수 없습니다. 🎜

위 내용은 Go에서 추가의 이상한 동작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿