[Go] 파일 입출력
파일 입출력 같은 시스템에 접근하는 기능들은 os 패키지에 들어가있다.
때문에 먼저 패키지 import를 한다.
import (
"fmt"
"os"
)- 생성
파일을 생성하려면 os.Create 함수에 파일명을 입력해주면 된다. 그러면 파일 객체와 성공여부가 반환된다.
만약 기존에 있는 파일을 열고싶다면 Create 대신에 Open을 사용하면 된다.
//파일 만들기
file, err := os.Create("text.txt")
if err != nil {
panic("파일 생성 실패")
}- 쓰기
그리고 파일 객체의 Write에 텍스트를 바이트 슬라이스를 변환해 넘겨주면 바이트가 버퍼로 넘어간다. 바로 써지는 건 아니다.
//쓰기
len, err := file.Write([]byte("안녕하시오"))
if err != nil {
panic("파일 쓰기 실패")
}
fmt.Printf("쓰기 성공한 길이 %d\n", len)
근데 단순히 문자열만 보낼거라면 저렇게 일일히 바이트 슬라이스로 바꾸는건 꽤나 귀찮은 일이다.
그럼 WriteString을 쓰면 된다.
위아래 코드는 같은 동작을 한다.
//쓰기
len, err := file.WriteString("안녕하시오")
if err != nil {
panic("파일 쓰기 실패")
}
fmt.Printf("쓰기 성공한 길이 %d\n", len)- 닫기
닫아야 수정한 내용이 파일에 반영된다.
//닫기
err = file.Close()
if err != nil {
panic("파일 닫기 실패")
}package main
import (
"fmt"
"os"
)
func main() {
//파일 만들기
file, err := os.Create("text.txt")
if err != nil {
panic("파일 생성 실패")
}
//쓰기
len, err := file.WriteString("안녕하시오")
if err != nil {
panic("파일 쓰기 실패")
}
fmt.Printf("쓰기 성공한 길이 %d\n", len)
//닫기
err = file.Close()
if err != nil {
panic("파일 닫기 실패")
}
}
여튼 이렇게 하면 대충 이렇게 뜰 것이다.
다섯글자인데 15가 나오는건 utf-8에서 한글을 글자당 3바이트로 쪼개기 때문이다.
텍스트파일을 열어도 잘 보인다.

이제 저걸 코드로 다시 읽어보자
- 열기
아까랑 똑같다. 그냥 Open에 파일명 넣어주면 파일 객체를 생성해준다.
//파일 열기
file, openError := os.Open("text.txt")
if openError != nil {
panic("파일 생성 실패")
}- 읽기
이건 좀 귀찮다. 값을 받아올 슬라이스를 생성해주고 Read 함수의 파라미터로 넘겨야 한다. 그럼 슬라이스에 값이 들어올 것이다.
//읽기
bytes := make([]byte, 100, 100) //슬라이스를 길이 100짜리로 생성
len, readError := file.Read(bytes)
if readError != nil {
panic("파일 읽기 실패")
}
fmt.Printf("읽기 성공한 개수: %d\n", len)
fmt.Printf("텍스트: %s", string(bytes))
이건 WriteString같은 버전은 없다.
여튼 이러면
package main
import (
"fmt"
"os"
)
func main() {
//파일 열기
file, openError := os.Open("text.txt")
if openError != nil {
panic("파일 생성 실패")
}
//읽기
bytes := make([]byte, 100, 100) //슬라이스를 길이 100짜리로 생성
len, readError := file.Read(bytes)
if readError != nil {
panic("파일 읽기 실패")
}
fmt.Printf("읽기 성공한 개수: %d\n", len)
fmt.Printf("텍스트: %s", string(bytes))
file.Close()
}
잘 읽어올 것이다.
더 많은 기능들을 알아보고 싶다면 아래 Doc을 참고하길 바란다.
https://golang.org/pkg/os/
근데 이 기능만으론 좀 단출하고 불편하다고 느낄 수도 있다.
그런 사람들을 위한 파일처리 전용 패키지 ioutil이 존대한다.
https://golang.org/pkg/io/ioutil/
여기서는 Open이나 Close 필요없이 바로바로 파일을 쓰거나 읽어올 수 있다,
이렇게
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
//파일 쓰기
ioutil.WriteFile("boom.txt",
[]byte("김수한무 거북이와 두루미"), os.ModeDir)
//파일 읽기
text, _ := ioutil.ReadFile("boom.txt")
fmt.Printf("%s", string(text))
}
잘 돌아간다.