Интерфейс io.Seeker

Интерфейс io.Seeker предназначен для объектов, поддерживающих произвольный доступ к данным. Он содержит единственный метод Seek, который позволяет изменить текущую позицию в потоке данных. В первый параметр передается смещение (offset) в байтах, во второй параметр передается константа, определяющая точку отсчета: io.SeekStart (от начала файла), io.SeekCurrent (от текущей позиции) или io.SeekEnd (от конца файла). Метод возвращает новую абсолютную позицию и ошибку, если она возникла.

Синтаксис

goSeek(offset int64, whence int) (int64, error)

Пример

Давайте создадим файл и переместим указатель на 10 байт от начала файла:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  pos, err := file.Seek(10, io.SeekStart)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Printf("New position: %d\n", pos)
}

Результат выполнения кода:

go"New position: 10"

Пример

Переместим указатель на 5 байт вперед от текущей позиции:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  _, err = file.Seek(10, io.SeekStart)
  if err != nil {
    fmt.Println(err)
    return
  }

  pos, err := file.Seek(5, io.SeekCurrent)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Printf("Position after forward move: %d\n", pos)
}

Результат выполнения кода:

go"Position after forward move: 15"

Пример

Переместим указатель на 20 байт от конца файла (отрицательное смещение):

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  pos, err := file.Seek(-20, io.SeekEnd)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Printf("Position from end: %d\n", pos)
}

Результат выполнения кода:

go"Position from end: 524"

Смотрите также

  • интерфейс io.Reader,
    предоставляющий метод Read для чтения данных
  • интерфейс io.Writer,
    предоставляющий метод Write для записи данных
  • интерфейс io.Closer,
    предоставляющий метод Close для закрытия ресурса
  • функцию io.SectionReader,
    которая создает Reader для чтения секции данных