Go (Golang)에서 파일 복사하는 방법
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Key Takeaways
- Go에서는
io.Copy
,os.Open
및os.Create
를 사용하여 파일을 복사할 수 있습니다. - 안전한 파일 작업을 위해서는 적절한 오류 처리 및 리소스 정리(
defer
를 통해)가 필수적입니다. - 권한을 유지하려면 복사 후
os.Stat
및os.Chmod
를 사용하십시오.
파일 복사는 로그 작성, 업로드 처리 또는 로컬 백업 관리 등 많은 애플리케이션에서 일반적인 작업입니다. Go(Golang)에서 표준 라이브러리는 파일 복사를 포함하여 파일 작업을 처리하는 강력하고 효율적인 방법을 제공합니다. 이 문서에서는 관용적인 코드와 모범 사례를 사용하여 Go에서 파일을 복사하는 방법을 안내합니다.
전제 조건
시작하기 전에 다음 사항이 있는지 확인하십시오.
- Go 설치 (1.16 이상 버전 권장)
- Go 구문에 대한 기본 지식
- 작동하는 Go 개발 환경
io.Copy
를 사용하여 파일 복사
Go에서 파일을 복사하는 가장 간단한 방법은 표준 라이브러리의 io.Copy
함수를 사용하는 것입니다. 다음은 전체 예제입니다.
package main import ( "fmt" "io" "os" ) func copyFile(src, dst string) error { // 소스 파일 열기 sourceFile, err := os.Open(src) if err != nil { return fmt.Errorf("소스 파일 열기 실패: %w", err) } defer sourceFile.Close() // 대상 파일 생성 destinationFile, err := os.Create(dst) if err != nil { return fmt.Errorf("대상 파일 생성 실패: %w", err) } defer destinationFile.Close() // 내용 복사 _, err = io.Copy(destinationFile, sourceFile) if err != nil { return fmt.Errorf("파일 복사 실패: %w", err) } // 파일 메타데이터를 디스크에 플러시 err = destinationFile.Sync() if err != nil { return fmt.Errorf("대상 파일 동기화 실패: %w", err) } return nil } func main() { err := copyFile("example.txt", "copy.txt") if err != nil { fmt.Println("오류:", err) } else { fmt.Println("파일이 성공적으로 복사되었습니다.") } }
설명
os.Open()
은 읽기 위해 소스 파일을 엽니다.os.Create()
는 대상 파일을 생성(또는 자릅니다).io.Copy()
는 소스에서 대상으로 데이터를 효율적으로 전송합니다.defer
는 파일 핸들이 올바르게 닫히도록 하는 데 사용됩니다.Sync()
는 예기치 않은 종료 시 데이터 손실 위험을 줄이기 위해 데이터가 디스크에 플러시되도록 합니다.
오류 처리
오류를 래핑하기 위해 fmt.Errorf
에서 %w
가 사용되는 것에 주목하십시오. 이는 나중에 디버깅 및 오류 추적을 위해 더 큰 애플리케이션에서 특히 유용한 errors.Is()
또는 errors.As()
를 사용하여 오류를 언래핑할 수 있도록 합니다.
보너스: 파일 권한 유지
원본 파일의 권한을 유지하려면 함수를 약간 확장할 수 있습니다.
import "io/fs" // 복사 및 동기화 후: info, err := os.Stat(src) if err != nil { return fmt.Errorf("소스 파일 정보 가져오기 실패: %w", err) } err = os.Chmod(dst, info.Mode().Perm()) if err != nil { return fmt.Errorf("파일 권한 설정 실패: %w", err) }
결론
Go에서 파일 복사는 표준 라이브러리를 통해 간단하고 효율적입니다. CLI 도구, 웹 서버 또는 파일 관리 애플리케이션에서 작업하든 파일 I/O를 올바르게 수행하는 방법을 이해하는 것이 필수적입니다.
큰 디렉토리를 복사하거나, 심볼릭 링크를 처리하거나, 메타데이터를 유지하는 등 더 고급 사용 사례의 경우 spf13/afero와 같은 타사 라이브러리를 탐색하거나 사용자 정의 재귀적 로직을 작성하는 것이 좋습니다.
FAQs
io.Copy
는 효율적이며 내부적으로 버퍼링된 I/O를 처리하여 코드를 더 간단하고 빠르게 만듭니다.
OS 버퍼를 디스크에 플러시하려면 대상 파일에서 file.Sync()
를 사용하십시오.
os.Stat()
을 사용하여 원본 모드를 가져오고 os.Chmod()
를 사용하여 새 파일에 적용합니다.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 저희를 팔로우하세요: @LeapcellHQ