[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를 남용하면 성능 저하와 유지보수의 어려움을 야기할 수 있으므로 신중하게 사용해야 합니다.
참고 문헌: