📕
Golang
  • Собеседование по golang
  • Вопросы собеседования
    • Список вопросов МТС
    • Список вопросов
    • Базовые вопросы по Golang
    • Go. Прорабатываем 25 основных вопросов собеседования
    • Функции
    • Структуры данных
    • Конкурентность и Параллелизм
    • Горутины
    • Примитивы синхронизации
    • Планировщик
    • Go: конкурентность и привязки к потокам в планировщике
    • Каналы
    • GC
  • спецификация
    • Спецификация Go: преобразования в и из строкового типа
    • переключатель типов (type switch)
    • for утверждения (for statements)
    • for утверждения с range условием
    • go утверждения (go statements)
    • select утверждения (select statements)
    • return утверждения (return statements)
    • continue утверждения (continue statements)
    • goto утверждения (goto statements)
    • fallthrough утверждения (fallthrough statements, утверждения "провала")
    • defer утверждения (defer statements)
    • встроенные функции, функция close
    • длина и емкость
    • аллокация, создание срезов (slice), карт (map) и каналов
    • добавление в срезы и копирование срезов
    • удаление элементов карты
    • обработка паники
    • начальная загрузка (bootstrapping)
    • пакеты
    • инициализация и выполнение программы, нулевое значение
    • инициализация пакета
    • выполнение программы
    • ошибки
    • паника во время выполнения (run-time panic)
  • Эффективный go
    • эффективный go
    • 50 оттенков go
    • Go: распространенные антипаттерны
    • Визуализация concurrency в Go с WebGL
  • требования для работы
    • Список навыков
  • habr
    • Изучаем многопоточное программирование в Go по картинкам
    • Go: конкурентность и привязки к потокам в планировщике
  • NP
    • Полиморфизм с интерфейсами в Golang
    • Объектно-ориентированное программирование в Golang
    • Владеешь merge  -  освой и rebase
  • ProgLib
    • Горутины
  • Untitled
  • Оптимизация
    • Go: Должен ли я использовать указатель вместо копии моей структуры?
  • Полезняшки
    • Using PostgreSQL JSONB with Go
Powered by GitBook
On this page

Was this helpful?

  1. спецификация

добавление в срезы и копирование срезов

Previousаллокация, создание срезов (slice), карт (map) и каналовNextудаление элементов карты

Last updated 4 years ago

Was this helpful?

Встроенные функции append и copy помогают в общих операциях срезов. Для обеих функций результат не зависит от того, перекрывается ли память, на которую ссылаются аргументы.

функция append добавляет ноль или более значений x к s типа S, который должен быть типом среза, и возвращает полученный срез, также типа S. Значения x передаются параметру типа ... T, где T тип элемента S и применяются соответствующие правила передачи параметров. В особом случае append также принимает первый аргумент, присваиваемый (assignable) типу []byte, со вторым аргументом строкового типа, за которым следует .... В этой форме добавляются байты строки.

append(s S, x ...T) S  // T это элемент типа S

Если емкость s недостаточно велика, чтобы соответствовать дополнительным значениям, append выделяет новый, достаточно большой базовый массив, который подходит как существующим элементам среза, так и дополнительным значениям. В противном случае append повторно использует базовый массив.

s0 := []int{0, 0}
s1 := append(s0, 2)                // добавляем отдельный элемент     s1 == []int{0, 0, 2}
s2 := append(s1, 3, 5, 7)          // добавляем несколько элементов   s2 == []int{0, 0, 2, 3, 5, 7}
s3 := append(s2, s0...)            // добавляем срез                  s3 == []int{0, 0, 2, 3, 5, 7, 0, 0}
s4 := append(s3[3:6], s3[2:]...)   // добавляем перекрывающийся срез  s4 == []int{3, 5, 7, 2, 3, 5, 7, 0, 0}

var t []interface{}
t = append(t, 42, 3.1415, "foo")   // t == []interface{}{42, 3.1415, "foo"}

var b []byte
b = append(b, "bar"...)            // добавляем содержимое строки      b == []byte{'b', 'a', 'r' }

Функция copy копирует элементы среза из исходного src в dst назначения и возвращает количество скопированных элементов. Оба аргумента должны иметь одинаковый тип элемента T и должны быть присваиваемыми срезу типа []T. Количество копируемых элементов является минимумом len(src) и len(dst). В особом случае copy также принимает целевой аргумент, назначаемый типу []byte с исходным аргументом строкового типа. Эта форма копирует байты из строки в срез байтов.

copy(dst, src []T) int
copy(dst []byte, src string) int

Примеры:

var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
var s = make([]int, 6)
var b = make([]byte, 5)
n1 := copy(s, a[0:])            // n1 == 6, s == []int{0, 1, 2, 3, 4, 5}
n2 := copy(s, s[2:])            // n2 == 4, s == []int{2, 3, 4, 5, 4, 5}
n3 := copy(b, "Hello, World!")  // n3 == 5, b == []byte("Hello")
variadic