Go 리플렉션에 함수 추가
Go에서는 리플렉션을 사용하여 슬라이스에 요소를 추가해도 원본 슬라이스가 업데이트되지 않는 것 같습니다. 이는 다음 코드에 설명되어 있습니다.
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value = reflect.Append(value, reflect.ValueOf(55)) fmt.Println(value.Len()) // prints 1 } func main() { arr := []int{} appendToSlice(&arr) fmt.Println(len(arr)) // prints 0 }
왜 작동하지 않나요?
근본 원인은 Reflect.Append의 동작에 있습니다. 기존의 추가 함수와 마찬가지로 새로운 슬라이스 값을 반환합니다. 이 경우 값 변수에 할당된 값이 이 새 조각으로 대체되어 효과적으로 복사본이 생성됩니다.
설명을 위해 현재 상황을 강조하기 위해 예시를 수정해 보겠습니다.
func appendToSlice(arrPtr *[]int) { value := *arrPtr value = append(value, 55) fmt.Println(len(value)) } func main() { arr := []int{} appendToSlice(&arr) fmt.Println(len(arr)) }
이 수정된 코드는 사용하지 않더라도 동일한 출력을 생성합니다. Reflection.
해결책
반사를 사용하여 슬라이스에 올바르게 추가하려면 Value.Set 메서드를 사용하여 원래 값을 수정해야 합니다.
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }
이 접근 방식은 새로 생성된 슬라이스를 value.Set에 전달하여 원본 슬라이스를 업데이트합니다.
위 내용은 Reflection의 `Append` 기능이 원본 Go 슬라이스를 업데이트하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!