Day 9 with Go-Lang

1 minute read

파일 읽고 쓰기

Go 에서 파일을 읽고 쓰기 위해 Go 표준 패키지인 os 패키지를 사용할 수 있다. os.Open() 함수는 기존 파일을 열 때 사용하고, os.Create() 는 새 파일을 생성할 때 사용한다. Open, Create 함수는 File 타입을 리턴하는데, 이 File 타입의 메소드인 Read(), Write() 를 사용해 파일을 읽고 쓸 수 있다.

package main

import (
	"io"
	"os"
)

func main() {
	fi, err := os.Open("1.txt")
	defer fi.Close()

	if err != nil {
		panic(err)
	}

	fo, err := os.Create("2.txt")
	defer fo.Close()

	if err != nil {
		panic(err)
	}

	buf := make([]byte, 1024)

	// 루프
	for {
		// 읽기
		cnt, err := fi.Read(buf)
		if err != nil && err != io.EOF {
			panic(err)
		}

		if cnt == 0 {
			break
		}

		// 쓰기
		_, err = fo.Write(buf[:cnt])
		if (err != nil) {
			panic(err)
		}
	}
}

Go 표준 패키지인 ioutil 패키지는 I/O 관련한 편리한 유틸리티를 제공하는 패키지이다. 입력 파일이 매우 크지 않은 경우, 이 패키지의 ReadFile, WriteFile 함수를 이용하면 편리하게 파일을 읽고 쓸 수 있다. 아래 예제는 ioutil 을 사용해 파일을 그대로 복사하는 코드이다.

package main

import "io/ioutil"

func main() {
	// 파일 읽기
	bytes, err := ioutil.ReadFile("1.txt")
	if err != nil {
		panic(err)
	}

	// 파일 쓰기
	err = ioutil.WriteFile("2.txt", bytes, 0)
	if err != nil {
		panic(err)
	}
}

HTTP GET 호출

Go 의 표준 패키지인 http 패키지는 웹 관련 클라이언트 및 서버 기능을 제공한다. 그 중 http.Get() 메소드는 쉽게 웹 페이지나 웹 데이터를 가져오는데 사용된다.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	// GET 호출
	resp, err := http.Get("http://don-garu.github.io")
	defer resp.Body.Close()

	if err != nil {
		panic(err)
	}

	data, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		panic(err)
	}

	fmt.Printf("%s\n", string(data))
}
  • HTTP GET 헤더 변경

http.Get() 은 한 문장으로 HTTP GET 을 호출하는 장점이 있지만, Request 시 헤더를 추가한다던지, Request 스트림을 추가하는 것과 같은 세밀한 컨트롤을 할 수 없는 단점이 있다. Request 시 보다 많은 컨트롤이 필요하다면, Request 객체를 (NewRequest 생성자를 통해) 직접 생성해 http.Client 객체를 통해 호출하면 된다.

아래 예제는 http.NewRequest() 생성자를 통해 Request 객체를 생성하고, 여기에 임의 헤더를 추가하고, http.Client 객체를 통해 호출하는 코드이다. HTTP 호출의 결과는 Response 객체인데, 이 객체의 Body 필드를 통해 실제 Request 결과를 가져올 수 있다.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	// Request 객체 생성
	req, err := http.NewRequest("GET", "http://don-garu.github.io", nil)
	if err != nil {
		panic(err)
	}

	// 필요시 헤더 추가 가능
	req.Header.Add("User-Agent", "Crawler")

	// Client 객체에서 Request 실행
	client := &http.Client{}
	resp, err := client.Do(req)
	defer resp.Body.Close()

	if err != nil {
		panic(err)
	}

	// 결과 출력
	bytes, _ := ioutil.ReadAll(resp.Body)
	str := string(bytes) // 바이트를 문자열로
	fmt.Println(str)
}

Reference : 예제로 배우는 Go 프로그래밍