저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
핵심 정리
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
리플렉션리플렉션은 실행 시점(Runtime, 런타임)에 인터페이스나 구조체 등의 타입 정보를 얻어내거나 결정하는 기능입니다.
형태 및 패키지 | 함수명 | 설명 |
---|---|---|
리플렉션(reflect) | reflect.TypeOf | 타입 정보 얻기 |
Name | 타입 이름 얻기 | |
Size | 타입 크기 얻기 | |
Kind | 타입 종류 얻기 | |
FieldByName | 구조체에서 필드 이름으로 필드 정보 얻기 | |
reflect.ValueOf | 값 정보 얻기 | |
Type | 값이 담긴 변수의 타입 이름 얻기 | |
Kind | 값이 담긴 변수의 타입 종류 얻기 | |
Elem | 인터페이스, 포인터의 값 정보 얻기 | |
Set | 값 정보에 함수 연결 | |
reflect.MakeFunc | 함수 정보 생성 |
리플렉션을 사용하면 구조체의 태그를 가져올 수 있습니다.
type Person struct {
name string `tag1:"이름" tag2:"Name"` // 구조체에 태그 설정
age int `tag1:"나이" tag2:"Age"` // 구조체에 태그 설정
}
func main() {
p := Person{}
name, _ := reflect.TypeOf(p).FieldByName("name")
fmt.Println(name.Tag.Get("tag1"), name.Tag.Get("tag2")) // 이름 Name
age, _ := reflect.TypeOf(p).FieldByName("age")
fmt.Println(age.Tag.Get("tag1"), age.Tag.Get("tag2")) // 나이 Age
}
리플렉션을 사용하면 동적으로 함수를 생성할 수 있습니다.
func h(args []reflect.Value) []reflect.Value { // 매개변수와 리턴값은 반드시 []reflect.Value를 사용
fmt.Println("Hello, world!")
return nil
}
func main() {
var hello func() // 함수를 담을 변수 선언
fn := reflect.ValueOf(&hello).Elem() // hello의 주소를 넘긴 뒤 Elem으로 값 정보를 가져옴
v := reflect.MakeFunc(fn.Type(), h) // h의 함수 정보를 생성
fn.Set(v) // hello의 값 정보인 fn에 h의 함수 정보 v를 설정하여 함수를 연결
hello()
}
import에 패키지 주소만 설정하면 인터넷 저장소의 패키지를 사용할 수 있습니다.
import (
"fmt"
"github.com/golang/example/stringutil"
)
go get
명령을 입력하여 패키지를 받습니다.
패키지의 함수, 변수, 상수를 외부에서 사용할 수 있게 하려면 함수, 변수, 상수의 첫 글자를 대문자로 지정해야 합니다.
package calc
var Num1 int = 10 // 외부에서 사용할 수 있도록 변수의 첫 글자는 영문 대문자로
const Con1 int = 20 // 외부에서 사용할 수 있도록 상수의 첫 글자는 영문 대문자로
func Sum(a int, b int) int { // 외부에서 사용할 수 있도록 함수의 첫 글자는 영문 대문자로
return a + b
}
패키지, 함수, 변수, 상수위에 // 주석을 작성하면 설명을 문서화 할 수 있습니다.
// 계산 패키지
package calc
// 두 정수를 더함
func Sum(a int, b int) int {
return a + b
}
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.