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를 추가합니다. 이는 내부 복사본만 수정합니다. 함수 외부에서는 원래 숫자 슬라이스가 변경되지 않은 상태로 유지됩니다.
이 문제를 해결하려면 슬라이스를 참조로 전달해야 합니다. 이를 수행하는 한 가지 방법은 슬라이스에 포인터를 전달하는 것입니다:
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 }
이 경우 유효성 검사 함수는 수정된 메시지 조각을 반환하므로 조각에 포인터를 전달할 필요가 없습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3