[go] reflect와 임의의 값 다루기

Go 언어에서 reflect 패키지는 임의의 값에 대한 타입 정보를 조사하고, 값 자체를 조작할 수 있는 기능을 제공합니다. 이를 통해 유연하고 동적인 프로그래밍을 할 수 있습니다.

reflect 패키지 소개

reflect 패키지는 런타임에 임의의 타입을 조사하고 조작하는 기능을 제공합니다. 예를 들어, 변수의 타입을 확인하거나 동적으로 값을 설정하거나 메소드를 호출할 수 있습니다.

타입 정보 확인

reflect 패키지를 사용하여 값의 타입 정보를 확인할 수 있습니다. 예를 들어, 아래와 같이 코드를 작성할 수 있습니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var num int = 10
	fmt.Println(reflect.TypeOf(num))
}

위 예제에서 reflect.TypeOf 함수를 사용하여 num 변수의 타입을 확인할 수 있습니다.

값 설정

reflect 패키지를 사용하여 값을 동적으로 설정할 수도 있습니다. 아래 코드는 정수형 변수에 새로운 값을 설정하는 예제입니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var num int = 10
	value := reflect.ValueOf(&num)
	value.Elem().SetInt(20)
	fmt.Println(num) // 출력: 20
}

위 예제에서 reflect.ValueOf 함수를 사용하여 변수의 값을 가져온 후, Elem 메소드로 해당 값을 설정할 수 있습니다.

메소드 호출

reflect 패키지를 사용하여 메소드를 동적으로 호출할 수도 있습니다. 아래 코드는 문자열 변수의 Len 메소드를 호출하는 예제입니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	str := "hello"
	value := reflect.ValueOf(str)
	methodValue := value.MethodByName("Len")
	result := methodValue.Call([]reflect.Value{})
	fmt.Println(result[0].Int()) // 출력: 5
}

위 예제에서는 reflect.ValueOf 함수를 사용하여 값을 가져온 후, MethodByName 메소드로 해당 메소드를 호출할 수 있습니다.

결론

Go 언어의 reflect 패키지를 사용하면 임의의 값에 대한 타입 정보를 확인하고, 값을 설정하거나 메소드를 호출하는 등 다양한 동적 프로그래밍 기능을 수행할 수 있습니다. 이를 통해 보다 유연하고 강력한 프로그램을 작성할 수 있습니다.

더 많은 정보는 Go 언어 공식 문서에서 확인할 수 있습니다.