CastleJo의 개발일지

Go Go - 4

|

최근엔 간단한 HTTP 서버 열기, 명령행 인자 라이브러리 사용, 로컬 패키지 추가에 대해 공부했다.

HTTP 서버 열기

Go의 표준 패키지인 net/http 라는 라이브러리를 사용하여 간단하게 서버를 열 수 있다.

import "net/http"
import "log"
import "fmt"

func server1() {
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

간단하다. localhost의 8000번 포트로 요청이 오면 handler()를 작동한다.
간단한 echo 서버이다.

import "net/http"
import "log"
import "fmt"
import "sync"

var mu sync.Mutex
var count int

func server2() {
	http.HandleFunc("/", handler2)
	http.HandleFunc("/count", counter)
	log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler2(w http.ResponseWriter, r *http.Request) {
	mu.Lock()
	count++
	mu.Unlock()
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

func counter(w http.ResponseWriter, r *http.Request) {
	mu.Lock()
	fmt.Fprintf(w, "Count %d\n", count)
	mu.Unlock()
}

위의 에코서버에 호출될때마다 counter를 추가시켰다.

counter에는 mutex 개념이 들어갔다.

Mutex를 사용하려면 간단하게 sync 패키지를 추가한 후 sync.Mutex 변수를 추가해 사용하면 된다.

명령행 인자 라이브러리

flag 모듈을 사용한다.

import (
	"flag"
	"fmt"
	"strings"
)

var n = flag.Bool("n", true, "hint") // ,명령행인자, 호출값, 디폴트값, 힌트
var sep = flag.String("s", " ", "seperator")

func main() {
	flag.Parse()
	fmt.Print(strings.Join(flag.Args(), *sep)) // 명령행인자에 접근할 땐 포인터 호출
}

flag.타입 을 사용해 명령행 인자를 선언하고, Parse()로 접근한다.

로컬 패키지 만들기

일단 첫번째로, GOPATH를 설정해야 한다.

윈도우면 제어판의 환경변수에서 설정하면 되고,

리눅스에서는 export GOPATH={경로} 로 설정하면 된다.

다음 Go에서는, 기본적으로 패키지 이름디렉토리 이름 으로 지정한다.

나의 디렉토리 트리를 보면 이런 형태로 되어있다.

src/
    test/
        - test_func1.go
        - test_func2.go
    main.go

이렇게 한 다음 main.go 파일을 보자.

package main

import (
	"test"
	"fmt"
)

func main() {
	fmt.Println(test.Count(101))
	fmt.Println(test.CountLoop(101))
}

아주 간단한데, 내가 오랜 시간을 쓴 이유는 다음과 같다.

GO에서 Public 메소드와 Private 메소드는 첫글자가 대문자인지 소문자 인지에 따라 다르다.

앞 글자가 소문자면 private로 패키지 안에서만 접근이 가능하다… 이거때문에 왜 안되지? 하면서 2시간은 낭비한 것 같다.