기억하자! Go 로 파일쓰는 방법 5 가지(Write with Go)

go 를 이용하여 buffer(byte slice)에 있는 데이터를 파일로 쓰는 방법에 대해 알아본다.
파일에 데이터를 쓴다는 목적만 만족시키려면 아래의 5 가지 방법 어느 것을 사용해도 되겠다.
하지만, 성능과 안정성을 고려한 쓰기는 또 다른 문제다.
자신이 개발하려는 프로그램이 어떤 성격의 것인가를 먼저 면밀히 검토하여 적절한 방법을 사용해야 한다.
데이터의 유실 가능성이 있지만 성능이 가장 중요하다고 하면 memory buffer(bufio)를 사용한 방식이 적합할 것이다.
한건의 데이터도 유실되면 안되는 상황에서는 Application 에게 응답을 주기 전에 반드시 IO Device 에 기록되었다는 보장이 있어야 할 것이다.
go 의 standard library 에는 이러한 다양한 상황을 모두 고려하여 선택 사용할 수 있도록 package 들이 제공되고 있다.

5 가지 쓰기 방법을 보자.

  1. os.Create() 를 이용하여 파일 생성 후 fmt.Fprintf() 를 사용하여 쓰는 방식
  2. os.Create() 를 이용하여 파일 생성 후 f.WriteString() 를 사용하여 쓰는 방식
  3. os.Create() 를 이용하여 파일 생성 후 bufio.NewWriter() 를 사용하여 쓰는 방식
  4. ioutil.WriteFile() 를 사용하여 쓰는 방식
  5. os.Create() 를 이용하여 파일 생성 후 io.WriteString() 를 사용하여 쓰는 방식

위의 각 방식을 이용한 파일 쓰기 sample 코드는 다음과 같다.

package main

import (
  "bufio"
  "fmt"
  "io"
  "io/ioutil"
  "os"
)

func checkError(err error) {
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
}

func main() {
  s := []byte("Data to write\n")

  // 1.
  f1, err := os.Create("/tmp/f1.txt")
  checkError(err)
  defer f1.Close()
  fmt.Fprintf(f1, string(s))

  // 2.
  f2, err := os.Create("/tmp/f2.txt")
  checkError(err)
  defer f2.Close()
  n, err := f2.WriteString(string(s))
  fmt.Printf("wrote %d bytes\n", n)

  // 3.
  f3, err := os.Create("/tmp/f3.txt")
  checkError(err)
  w := bufio.NewWriter(f3)
  n, err = w.WriteString(string(s))
  fmt.Printf("wrote %d bytes\n", n)
  w.Flush()

  // 4.
  f4 := "/tmp/f4.txt"
  err = ioutil.WriteFile(f4, s, 0644)
  checkError(err)

  // 5.
  f5, err := os.Create("/tmp/f5.txt")
  checkError(err)
  n, err = io.WriteString(f5, string(s))
  checkError(err)
  fmt.Printf("wrote %d bytes\n", n)
}

You may also like...