가장 빨리 만나는 Go 언어 핵심 정리

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

핵심 정리

이재홍 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 공유는 허용합니다.

Published

2015-06-01