[go] reflect 패키지를 활용한 필드 값 조작

Go 언어는 reflect 패키지를 통해 실행 중인 프로그램의 구조체(Struct)나 인터페이스(Interface) 등의 타입 정보를 조작할 수 있는 기능을 제공합니다. 이를 통해 프로그램의 런타임 동작을 유연하게 제어할 수 있습니다.

이번 포스트에서는 reflect 패키지를 사용하여 구조체의 필드 값을 동적으로 읽고 쓰는 방법에 대해 알아보겠습니다.

필드 값 읽기

reflect.ValueOf를 사용하여 구조체의 필드 값을 읽을 수 있습니다. 예를 들어, 다음과 같은 구조체가 있다고 가정해 봅시다.

type Person struct {
    Name string
    Age  int
}

이 구조체의 필드 값을 읽어오려면 reflect 패키지를 이용하여 다음과 같이 할 수 있습니다.

import "reflect"

func main() {
    person := Person{Name: "Alice", Age: 30}
    value := reflect.ValueOf(person)
    nameFieldValue := value.FieldByName("Name").String()
    ageFieldValue := value.FieldByName("Age").Int()
    println(nameFieldValue, ageFieldValue)
}

필드 값 수정하기

reflect 패키지를 사용하여 구조체의 필드 값을 동적으로 수정할 수도 있습니다. 다음은 구조체의 필드 값을 수정하는 예제 코드입니다.

func main() {
    var person interface{} = &Person{Name: "Bob", Age: 25}
    value := reflect.ValueOf(person).Elem()
    value.FieldByName("Name").SetString("David")
    value.FieldByName("Age").SetInt(27)
    modifiedPerson := value.Interface().(*Person)
    println(modifiedPerson.Name, modifiedPerson.Age)
}

결론

reflect 패키지를 사용하면 실행 중인 프로그램의 구조체나 인터페이스 등의 타입 정보를 동적으로 조작할 수 있어 매우 유용합니다. 하지만 reflect를 남용하면 성능 저하와 유지보수의 어려움을 야기할 수 있으므로 신중하게 사용해야 합니다.

참고 문헌: