기본 파일 처리 방법
1. 구조체를 만든다.
type Page struct {
Title string
Body []byte
}
2. 구조체에 구조체를 파일에 저장하는 Save() 메소드를 작성한다.
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
3. 구조체를 파일을 읽어서 구조체에 저장하는 loadPage()메소드를 작성한다.
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
4. 구조체를 저장한다.
구조체는 초기화는 구조체 타입 + {필드명:값, 필드명:값, .... }
구조체의 메소드 지정시 리시버를 포인터로 지정했기 때문에 &을 사용하여 주소값으로 넘긴다. 그러면 변수는 포인터 변수로 인식한다.
p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
구조체의 메소드를 호출
p1.save()
5. 구조체를 호출한다.
파일을 읽어서 구조체에 넣는다.
p2, _ := loadPage("TestPage")
구조체의 값을 읽어서 타입변환을 처리하여 출력한다.
fmt.Println(string(p2.Body))
6. 이를 HTTP로 변환해도 실질적인 Response에 파일을 읽어서 처리가 가능하다.
7. http로 변환하기 위해서는 handler 함수를 등록한다.
http 패키지 내의 Request 구조체 안의URL 필드는 *url.URL 타입이므로 url 패키지에 URL 구조체 내의 Path 파일을 가져옵니다.
type URL struct {
Scheme string Opaque string // encoded opaque data User *Userinfo // username and password information Host string // host or host:port Path string RawQuery string // encoded query values, without '?' Fragment string // fragment for references, without '#' }
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, _ := loadPage(title)
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", p.Title, p.Body)
}
8. 핸들러를 http 서버에 등록하고 실제 호출이 오면 Listener 통해 매칭시킨다.
// 핸들러 위치에 등록
http.HandleFunc("/view/", viewHandler)
// http 서버에 대한 포트 및 주소 지정
http.ListenAndServe(":8080", nil)
//실제 프로그래밍...
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// response 페이지 구조체 생성
type Page struct {
Title string
Body []byte
}
// response 페이지 파일 세이브
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
//response 페이지 읽어오기
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
//http 서버 핸들러 등록
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, _ := loadPage(title)
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", p.Title, p.Body)
}
func main() {
/*
// 페이지 생성
p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
p1.save()
// 페이지 파일 읽어오기
p2, _ := loadPage("TestPage")
//페이지 파일 출력
fmt.Println(string(p2.Body))
*/
// 핸들러 위치에 등록
http.HandleFunc("/view/", viewHandler)
// http 서버에 대한 포트 및 주소 지정
http.ListenAndServe(":8080", nil)
}
댓글
댓글 쓰기