7. Работа с файлами и потоками #
Работа с файлами и потоками данных в Go выполняется с использованием стандартных пакетов, таких как os
, io
, io/ioutil
, bufio
, encoding/json
, и encoding/xml
.
7.1 Чтение и запись файлов #
Чтение файла: #
Используйте пакет os
для открытия и чтения файла.
Пример:
package main
import (
"fmt"
"os"
"io"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
defer file.Close()
content := make([]byte, 64)
for {
n, err := file.Read(content)
if err == io.EOF {
break
}
if err != nil {
fmt.Println("Ошибка чтения:", err)
return
}
fmt.Print(string(content[:n]))
}
}
Запись в файл: #
Используйте os.Create
для создания или перезаписи файла.
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("output.txt")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
defer file.Close()
_, err = file.WriteString("Привет, мир!\n")
if err != nil {
fmt.Println("Ошибка записи:", err)
}
}
7.2 Работа с файловыми путями #
Для работы с путями используется пакет path/filepath
.
Получение базового имени и расширения: #
package main
import (
"fmt"
"path/filepath"
)
func main() {
path := "/home/user/documents/file.txt"
fmt.Println("Базовое имя:", filepath.Base(path)) // file.txt
fmt.Println("Расширение:", filepath.Ext(path)) // .txt
}
Построение пути: #
package main
import (
"fmt"
"path/filepath"
)
func main() {
path := filepath.Join("home", "user", "documents", "file.txt")
fmt.Println("Путь:", path) // home/user/documents/file.txt
}
7.3 Использование пакета io
и io/ioutil
#
io.Copy
для копирования данных:
#
package main
import (
"io"
"os"
)
func main() {
src, _ := os.Open("source.txt")
defer src.Close()
dst, _ := os.Create("destination.txt")
defer dst.Close()
io.Copy(dst, src) // Копируем содержимое
}
Простое чтение файла с ioutil
:
#
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("example.txt")
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println(string(content))
}
Простая запись: #
ioutil.WriteFile("output.txt", []byte("Данные"), 0644)
Примечание: Начиная с Go 1.16, io/ioutil
объявлен устаревшим. Используйте вместо него os
и io
.
7.4 Буферизация потоков #
Для работы с большими объемами данных эффективнее использовать буферизацию с пакетом bufio
.
Чтение с буферизацией: #
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Open("example.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text()) // Чтение строки
}
}
Запись с буферизацией: #
package main
import (
"bufio"
"os"
)
func main() {
file, _ := os.Create("output.txt")
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("Привет, буферизация!\n")
writer.Flush() // Обязательно вызывайте Flush для записи буфера
}
7.5 Работа с JSON и XML #
Чтение и запись JSON: #
Пакет encoding/json
позволяет сериализовать и десериализовать данные в формате JSON.
Пример:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// Запись JSON
person := Person{Name: "Иван", Age: 30}
file, _ := os.Create("person.json")
defer file.Close()
encoder := json.NewEncoder(file)
encoder.Encode(person)
// Чтение JSON
file, _ = os.Open("person.json")
defer file.Close()
var decodedPerson Person
decoder := json.NewDecoder(file)
decoder.Decode(&decodedPerson)
fmt.Println(decodedPerson)
}
Чтение и запись XML: #
Для работы с XML используйте encoding/xml
.
Пример:
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
}
func main() {
person := Person{Name: "Иван", Age: 30}
// Запись XML
file, _ := os.Create("person.xml")
defer file.Close()
encoder := xml.NewEncoder(file)
encoder.Indent("", " ")
encoder.Encode(person)
// Чтение XML
file, _ = os.Open("person.xml")
defer file.Close()
var decodedPerson Person
decoder := xml.NewDecoder(file)
decoder.Decode(&decodedPerson)
fmt.Println(decodedPerson)
}
Эти инструменты дают гибкость и удобство при работе с файлами и потоками данных, позволяя обрабатывать текстовые и бинарные форматы.