더북(TheBook)

값 변경

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() 메서드를 사용하여 값의 주소에 접근하는 방법을 통해서 다른 값으로 교체할 수는 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.