Go Go - 4
20 Mar 2021 | Go최근엔 간단한 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시간은 낭비한 것 같다.