Wie man eine Datei in Go (Golang) kopiert
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Key Takeaways
- Du kannst Dateien in Go kopieren, indem du
io.Copy
,os.Open
undos.Create
verwendest. - Eine ordnungsgemäße Fehlerbehandlung und Ressourcenbereinigung (via
defer
) sind für sichere Dateibearbeitungen unerlässlich. - Um Berechtigungen zu erhalten, verwende
os.Stat
undos.Chmod
nach dem Kopieren.
Das Kopieren von Dateien ist eine häufige Aufgabe in vielen Anwendungen, egal ob du Protokolle schreibst, Uploads verarbeitest oder lokale Backups verwaltest. In Go (Golang) bietet die Standardbibliothek eine leistungsstarke und effiziente Möglichkeit, Dateibearbeitungen zu handhaben, einschließlich des Kopierens von Dateien. Dieser Artikel führt dich durch das Kopieren einer Datei in Go unter Verwendung von idiomatischem Code und Best Practices.
Voraussetzungen
Bevor du eintauchst, stelle sicher, dass du Folgendes hast:
- Go installiert (Version 1.16 oder höher empfohlen)
- Grundkenntnisse der Go-Syntax
- Eine funktionierende Go-Entwicklungsumgebung
Verwenden von io.Copy
zum Kopieren von Dateien
Der einfachste Weg, eine Datei in Go zu kopieren, ist die Verwendung der Funktion io.Copy
aus der Standardbibliothek. Hier ist ein vollständiges Beispiel:
package main import ( "fmt" "io" "os" ) func copyFile(src, dst string) error { // Öffne die Quelldatei sourceFile, err := os.Open(src) if err != nil { return fmt.Errorf("Fehler beim Öffnen der Quelldatei: %w", err) } defer sourceFile.Close() // Erstelle die Zieldatei destinationFile, err := os.Create(dst) if err != nil { return fmt.Errorf("Fehler beim Erstellen der Zieldatei: %w", err) } defer destinationFile.Close() // Kopiere den Inhalt _, err = io.Copy(destinationFile, sourceFile) if err != nil { return fmt.Errorf("Fehler beim Kopieren der Datei: %w", err) } // Schreibe die Datei-Metadaten auf die Festplatte err = destinationFile.Sync() if err != nil { return fmt.Errorf("Fehler beim Synchronisieren der Zieldatei: %w", err) } return nil } func main() { err := copyFile("example.txt", "copy.txt") if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Datei erfolgreich kopiert.") } }
Erklärung
os.Open()
öffnet die Quelldatei zum Lesen.os.Create()
erstellt (oder kürzt) die Zieldatei.io.Copy()
überträgt die Daten effizient von der Quelle zum Ziel.defer
wird verwendet, um sicherzustellen, dass die Dateihandles ordnungsgemäß geschlossen werden.Sync()
stellt sicher, dass die Daten auf die Festplatte geschrieben werden, wodurch das Risiko von Datenverlust bei unerwartetem Herunterfahren verringert wird.
Fehlerbehandlung
Beachte die Verwendung von %w
in fmt.Errorf
, um Fehler zu umschließen. Dies ermöglicht das spätere Entpacken von Fehlern mit errors.Is()
oder errors.As()
, was besonders in größeren Anwendungen für das Debuggen und die Fehlersuche nützlich ist.
Bonus: Beibehalten von Dateiberechtigungen
Wenn du die ursprünglichen Dateiberechtigungen beibehalten möchtest, kannst du die Funktion geringfügig erweitern:
import "io/fs" // Nach dem Kopieren und Synchronisieren: info, err := os.Stat(src) if err != nil { return fmt.Errorf("Fehler beim Abrufen der Quell-Dateiinformationen: %w", err) } err = os.Chmod(dst, info.Mode().Perm()) if err != nil { return fmt.Errorf("Fehler beim Setzen der Dateiberechtigungen: %w", err) }
Fazit
Das Kopieren von Dateien in Go ist mit der Standardbibliothek einfach und effizient. Egal, ob du an CLI-Tools, Webservern oder Dateiverwaltungsanwendungen arbeitest, das Verständnis für die korrekte Durchführung von Datei-I/O ist unerlässlich.
Für fortgeschrittenere Anwendungsfälle – wie das Kopieren großer Verzeichnisse, den Umgang mit symbolischen Links oder das Beibehalten von Metadaten – solltest du Bibliotheken von Drittanbietern wie spf13/afero verwenden oder eine benutzerdefinierte rekursive Logik schreiben.
FAQs
io.Copy
ist effizient und verarbeitet gepuffertes I/O intern, was den Code einfacher und schneller macht.
Verwende file.Sync()
auf der Zieldatei, um OS-Puffer auf die Festplatte zu schreiben.
Verwende os.Stat()
, um den ursprünglichen Modus abzurufen, und os.Chmod()
, um ihn auf die neue Datei anzuwenden.
Wir sind Leapcell, deine erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Next-Gen Serverless Plattform für Webhosting, Async Tasks und Redis:
Multi-Language Support
- Develop with Node.js, Python, Go, or Rust.
Deploy unlimited projects for free
- pay only for usage — no requests, no charges.
Unbeatable Cost Efficiency
- Pay-as-you-go with no idle charges.
- Example: $25 supports 6.94M requests at a 60ms average response time.
Streamlined Developer Experience
- Intuitive UI for effortless setup.
- Fully automated CI/CD pipelines and GitOps integration.
- Real-time metrics and logging for actionable insights.
Effortless Scalability and High Performance
- Auto-scaling to handle high concurrency with ease.
- Zero operational overhead — just focus on building.
Explore more in the Documentation!
Follow us on X: @LeapcellHQ