copy()로 빈 슬라이스를 복사하면 빈 슬라이스가 발생하는 이유
Go에서 슬라이스로 작업할 때 copy() 함수는 기존 슬라이스의 복사본을 만드는 데 자주 사용됩니다. 그러나 대상 슬라이스가 비어 있으면 복사 작업이 예기치 않게 작동합니다.
copy()에 대한 설명서에 따르면:
The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
이는 복사된 요소의 수가 소스 및 대상 슬라이스 길이의 최소값입니다. 그러나 대상 슬라이스가 비어 있으면(tmp가 빈 슬라이스로 초기화된 예에서와 같이) 요소가 복사되지 않습니다.
이 동작의 이유는 copy() 구현에 있습니다. 이 함수는 소스 슬라이스를 반복하고 소스 또는 대상 슬라이스의 끝에 도달할 때까지 요소를 대상 슬라이스에 복사합니다. 대상 슬라이스가 비어 있으면 복사할 요소가 없으므로 루프가 즉시 종료됩니다.
슬라이스의 비어 있지 않은 복사본을 생성하려면 대상 슬라이스를 0이 아닌 길이로 초기화해야 합니다. 이는 다음 예와 같이 make() 함수를 사용하여 달성할 수 있습니다.
arr := []int{1, 2, 3} tmp := make([]int, len(arr)) copy(tmp, arr) fmt.Println(tmp) // Output: [1 2 3]
대상 슬라이스의 길이를 명시적으로 설정하여 copy()에 모든 슬라이스를 복사할 수 있는 충분한 공간이 있는지 확인합니다. 소스 슬라이스의 요소. 이 동작은 복사된 요소 수가 소스 및 대상 슬라이스 길이의 최소값이라는 Go 언어 사양에도 문서화되어 있습니다.
따라서 copy( ), 복사 작업이 성공하도록 하려면 대상 슬라이스를 0이 아닌 길이로 초기화하는 것이 중요합니다.
위 내용은 Go에서 빈 대상 슬라이스에 복사할 때 `copy()`가 빈 슬라이스를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!