값 변경
reflect.Value 내부의 실제 값이 변경할 수 있는 값이라면 그 값을 동적으로 변경할 수 있다. 변경 가능한 값인지는 reflect.Value.CanSet() 메서드로 확인한다.
languages := []string{"golang", "java", "c++"} sliceValue := reflect.ValueOf(languages) value := sliceValue.Index(1) value.SetString("ruby") fmt.Println(languages) // [golang ruby c++] x := 1 if v := reflect.ValueOf(x); v.CanSet() { v.SetInt(2) // 호출되지 않음 } fmt.Println(x) // 1 v := reflect.ValueOf(&x) p := v.Elem() p.SetInt(3) fmt.Println(x) // 3
이 예제에서 if 문 내부 블록은 실행되지 않는다. int, float64, string처럼 변경할 수 없는 값은 그 값을 SetXXX 메서드로 변경할 수 없다. 하지만 Elem() 메서드를 사용하여 값의 주소에 접근하는 방법을 통해서 다른 값으로 교체할 수는 있다.