Go에서 함수에 인수를 전달하는 것은 값에 따라 수행됩니다. 즉, 인수에 대한 모든 변경 사항이 발생합니다. 함수 내의 내용은 원래 변수에 반영되지 않습니다. 이는 슬라이스와 같은 변경 가능한 데이터 유형으로 작업할 때 문제가 될 수 있습니다. 함수 내의 슬라이스에 추가해도 함수 범위를 벗어나는 원래 슬라이스에는 영향을 미치지 않기 때문입니다.
다음 예를 고려하세요.
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
이 예에서 AddToNumbs 함수는 nums 슬라이스의 복사본을 가져와서 값 4를 추가합니다. 이는 함수 내의 복사본만 수정하고 원본은 nums 슬라이스는 함수 외부에서 변경되지 않은 상태로 유지됩니다.
이 문제를 해결하려면 슬라이스를 참조로 전달해야 합니다. 이를 수행하는 한 가지 방법은 슬라이스에 포인터를 전달하는 것입니다.
func myAppend(list *[]string, value string) { *list = append(*list, value) }
슬라이스에 포인터를 전달하면 함수 내에서 변경된 모든 내용이 원본 슬라이스에 직접 반영됩니다. 그러나 포인터를 전달한다는 것은 함수가 예상하지 못한 방식으로 슬라이스를 수정할 수 있다는 의미이기도 하므로 포인터를 신중하게 사용하는 것이 중요합니다.
또 다른 대안은 설명된 것처럼 함수에서 수정된 슬라이스를 반환하는 것입니다. 다음 예에서는
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
이 경우 유효성 검사 함수가 수정된 메시지 슬라이스를 반환하므로 슬라이스에 포인터를 전달할 필요가 없습니다.
위 내용은 Go에서 함수 인수로 전달된 슬라이스를 어떻게 수정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!