[Golang] 변수가 어떤 interface의 매서드를 제공하는지 여부 확인하기

다음과 같은 타입이 있다고 치십시다.

type Boy int

func (b Boy) fight() {
	fmt.Println("Kaho-!")
}

func (b Boy) laugh() {
	fmt.Println("Kuwek-!")
}

type Girl float32

func (b Girl) laugh() {
	fmt.Println("kaka~")
}

또 다음과 같은 interface가 있다고 치자구요.

type Laughter interface {
	laugh()
}

type Fighter interface {
	fight()
}

이제 main 함수에서 Boy와 Girl 타입에 대한 객체를 정의할껀데요. 이 2개의 객체 변수가 Laughter, Fighter 인터페이스를 충족하는지의 여부를 검사하는 코드는 아래와 같습니다.

func main() {
	var b Boy
	var g Girl

	if _, ok := interface{}(b).(Laughter); ok {
		fmt.Println("Boy is laughter.")
	} else {
		fmt.Println("Boy is not laughter.")
	}

	if _, ok := interface{}(g).(Fighter); ok {
		fmt.Println("Girl is fighter.")
	} else {
		fmt.Println("Girl is not fighter.")
	}
}

그 결과는 예상하는 것처럼 아래와 같습니다.

Boy is laughter.
Girl is not fighter.

[Golang] HTTP 웹 서버(Web Sever) 예제

Go 언어는 그 목적 중에 하나로 빠르고 효율적인 서버 어플리케이션 개발에 있는데요. 타 언어와는 다르게 Go는 웹서버 개발을 위한 별도의 외부 라이브러리의 도움 없이 기본 라이브러리만으로도 뛰어난 웹서버를 개발할 수 있습니다. Go 언어를 이용한 간단한 웹서버 예제를 정리해 둡니다.

이 웹서버는 2개의 URL 정의를 통해 1:1로 매칭되는 2가지 기능을 제공합니다. 예를들어서 URL이 /list로 끝나는 것과 /mean으로 구성되는 것인데요. 첫번째는 미리 정의해둔 단어와 그 의미들에 대한 목록을 서비스하고, 두번째는 QueryString으로 word 파라메터에 지정한 단어의 의미를 서비스하는데, 예를들어 http://localhost:8000/mean?word=GIS라고 하면 GIS의 의미를 문자열로 서비스합니다.

먼저 단어와 그 의미를 저정하는 map을 dic라는 타입으로 정의하고 앞서 언급한 2개의 URL 정의에 대한 서비스로 사용할 매서드를 dic 타입에 추가합니다. 아래 코드가 이에 대한 것입니다.

type dic map[string]string

func (msg dic) list(w http.ResponseWriter, req *http.Request) {
    for word, mean := range msg {
        fmt.Fprintf(w, "%s: %s\n", word, mean)
    }
}

func (msg dic) mean(w http.ResponseWriter, req *http.Request) {
    word := req.URL.Query().Get("word")
    mean, ok := msg[word]

    if !ok {
        w.WriteHeader(http.StatusNotFound)
        return
    }

    fmt.Fprintf(w, "%s\n", mean)
}

데이터 저장을 위한 저장소와 이 데이터를 서비스할 매서드 정의가 끝났으니, 이를 활용하는 코드가 필요한데요. 활용하는 코드라 함은 저장소에 몇가지 단어와 그 의미를 담고, 웹서버를 만들어 웹서버가 서비스할 URL을 정의하는 것입니다. 아래의 코드가 이에 대한 것입니다.

func main() {
    msg := dic{
        "GIS":   "지리정보시스템",
        "BIM":   "빌딩정보시스템",
        "CAD":   "컴퓨터를 이용한 디자인",
        "Dip2K": "Deeper Into Purity Since 2000",
    }

    http.HandleFunc("/list", msg.list)
    http.HandleFunc("/mean", msg.mean)

    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

이제 실행하고 웹브라우저에서 http://localhost:8000/list를 호출하면 다음과 같은 결과를 볼 수 있습니다.

GIS: 지리정보시스템
BIM: 빌딩정보시스템
CAD: 컴퓨터를 이용한 디자인
Dip2K: Deeper Into Purity Since 2000

그리고 http://localhost:8000/mean?word=GIS를 호출하면 다음과 같은 결과가 표시됩니다.

지리정보시스템