0Pricing
Go Academy · Урок

Пакеты os и filepath

Переменные окружения, пути и взаимодействие с OS

«Пакеты os и filepath» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

os.Args — аргументы командной строки

os.Args содержит аргументы командной строки. os.Args[0] — имя программы:

package main
import ("fmt"; "os")

func main() {
    fmt.Println("Program:", os.Args[0])
    if len(os.Args) < 2 {
        fmt.Println("Usage: program <name>")
        os.Exit(1)
    }
    fmt.Printf("Hello, %s!\n", os.Args[1])
}

os.Getenv и os.Setenv

Читайте и изменяйте переменные окружения:

package main
import ("fmt"; "os")

func main() {
    // Read env var (returns "" if not set)
    home := os.Getenv("HOME")
    fmt.Println("HOME:", home)

    // Set env var
    os.Setenv("APP_ENV", "production")
    fmt.Println(os.Getenv("APP_ENV")) // production

    // Get with default pattern:
    port := os.Getenv("PORT")
    if port == "" { port = "8080" }
    fmt.Println("Port:", port)
}

os.Exit — завершение программы

os.Exit завершает программу с кодом состояния. Код 0 означает успех, ненулевой код — ошибку. Отложенные функции NOT выполняются:

package main
import ("fmt"; "os")

func main() {
    config := os.Getenv("CONFIG_PATH")
    if config == "" {
        fmt.Fprintln(os.Stderr, "error: CONFIG_PATH not set")
        os.Exit(1)  // signals error to the shell
    }
    fmt.Println("config:", config)
}

os.Open, os.Create, os.ReadFile

Операции с файлами с помощью пакета os:

package main
import ("fmt"; "os")

func main() {
    // Read entire file
    data, err := os.ReadFile("/etc/hostname")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("hostname: %s", data)

    // Write file (overwrites if exists)
    err = os.WriteFile("/tmp/test.txt", []byte("hello\n"), 0644)
    fmt.Println("write err:", err)
}

os.Stat — сведения о файле

os.Stat возвращает сведения о файле или каталоге:

package main
import ("fmt"; "os")

func main() {
    info, err := os.Stat("/tmp")
    if err != nil {
        if os.IsNotExist(err) {
            fmt.Println("does not exist")
        }
        return
    }
    fmt.Println(info.Name())     // tmp
    fmt.Println(info.IsDir())    // true
    fmt.Println(info.Size())     // size in bytes
    fmt.Println(info.Mode())     // file permissions
    fmt.Println(info.ModTime())  // last modified time
}

os.MkdirAll и os.RemoveAll

Создавайте и удаляйте деревья каталогов:

package main
import ("fmt"; "os")

func main() {
    // Create nested directories
    err := os.MkdirAll("/tmp/myapp/data/logs", 0755)
    fmt.Println("mkdir:", err)

    // Remove a file
    err = os.Remove("/tmp/test.txt")
    fmt.Println("remove:", err)

    // Remove directory and all contents
    err = os.RemoveAll("/tmp/myapp")
    fmt.Println("removeAll:", err)
}

path/filepath: кроссплатформенные пути

path/filepath обрабатывает пути к файлам с использованием разделителя путей ОС (/ в Unix, \ в Windows):

package main
import ("fmt"; "path/filepath")

func main() {
    // Join path components correctly
    p := filepath.Join("/home", "user", "docs", "file.txt")
    fmt.Println(p)  // /home/user/docs/file.txt

    // Split path and file
    dir, file := filepath.Split(p)
    fmt.Println(dir, file) // /home/user/docs/ file.txt

    // Extension
    fmt.Println(filepath.Ext(p))  // .txt

    // Base name
    fmt.Println(filepath.Base(p)) // file.txt
}

filepath.Walk — обход каталогов

Обойдите дерево каталогов, посетив каждый файл и каталог:

package main
import ("fmt"; "os"; "path/filepath")

func main() {
    err := filepath.Walk("/tmp", func(path string, info os.FileInfo, err error) error {
        if err != nil { return err }
        if info.IsDir() {
            fmt.Println("[DIR]", path)
        } else {
            fmt.Printf("[FILE] %s (%d bytes)\n", path, info.Size())
        }
        return nil
    })
    if err != nil { fmt.Println("walk error:", err) }
}

filepath.Glob — сопоставление с шаблоном

Найдите файлы, соответствующие шаблону glob:

package main
import ("fmt"; "path/filepath")

func main() {
    // Find all .go files in current directory
    matches, err := filepath.Glob("*.go")
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, m := range matches {
        fmt.Println(m)
    }

    // Absolute path resolution
    abs, _ := filepath.Abs("../myfile.txt")
    fmt.Println(abs)
}

os.TempDir и os.CreateTemp

Безопасно создавайте временные файлы:

package main
import ("fmt"; "os")

func main() {
    // System temp directory
    fmt.Println(os.TempDir()) // /tmp

    // Create a unique temp file
    f, err := os.CreateTemp("", "myapp-*.json")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer os.Remove(f.Name()) // clean up
    defer f.Close()
    fmt.Println("temp file:", f.Name())
    _, _ = f.WriteString(`{"status":"ok"}`)
}

Краткая проверка

Какая функция правильно объединяет компоненты пути к файлу кроссплатформенным способом?

Повторение: os и filepath

Краткое содержание:

  • os.Args — аргументы командной строки; os.Getenv/Setenv — окружение
  • os.ReadFile/WriteFile для простого ввода-вывода файлов
  • os.Stat — сведения о файле; os.IsNotExist(err) для отсутствующих файлов
  • os.MkdirAll/RemoveAll для управления каталогами
  • filepath.Join/Split/Ext/Base для кроссплатформенных путей
  • filepath.Walk для обхода деревьев каталогов

Часто задаваемые вопросы

Урок «Пакеты os и filepath» бесплатный?

Да — полный текст урока «Пакеты os и filepath» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Пакеты os и filepath»?

Переменные окружения, пути и взаимодействие с OS Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Пакеты os и filepath»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Пакеты fmt и strings
  2. strconv, math и sort
  3. Основы пакета time
  4. Пакеты os и filepath
← Назад к Go Academy