Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 189новых вакансий за сутки·63 398вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 858
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python14 032
  • Облачные технологии9 925
  • QA вакансии3 157
  • Android1 684
  • Инженер данных1 071
  • Продакт-менеджер317

Разработка

  • iOS1 564
  • Backend вакансии1 523
  • AI вакансии761
  • Fullstack вакансии612
  • Frontend вакансии527
  • Mobile вакансии28

По стеку

  • Go7 794
  • Java4 858
  • Node.js1 556
  • Kotlin1 341
  • Rust1 284
  • .NET1 169
  • PHP514
  • C++341
  • C#270

DevOps и инфраструктура

  • Kubernetes5 760
  • Linux-инфраструктура4 462
  • DevOps вакансии4 116
  • Terraform / IaC3 213
  • Мониторинг и Observability1 531
  • CI/CD1 154
  • SRE416
  • Кибербезопасность29

Аналитика и данные

  • Аналитик данных611
  • Бизнес-аналитик534
  • Data Scientist444
  • Системный аналитик80

Другие направления

  • Проджект-менеджер91
  • UI/UX дизайн77
  • Ручное тестирование14

По регионам

  • Вакансии в США31 393
  • Вакансии в Европе11 635
  • Работа в России3 672
  • Вакансии в Канаде2 524

По формату

  • Удалённые вакансии47 029
  • Релокация в США31 393
  • Гибридная работа8 379
  • Офисная работа6 474

По уровню

  • Senior вакансии27 937
  • Middle вакансии12 203
  • Junior вакансии4 563

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме GoВсе вопросы
GoJuniorТеория

В чём разница между make() и new() в Go?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

new(T) выделяет обнулённую память для любого типа и возвращает *T. make() инициализирует внутреннее состояние только для slice, map и channel, возвращая само значение, а не указатель.

new() — выделение памяти с нулевым значением

package main

import "fmt"

func main() {
    // new(int) возвращает *int, указывающий на int == 0
    p := new(int)
    fmt.Println(*p) // 0
    *p = 42
    fmt.Println(*p) // 42

    // Эквивалентно:
    var i int
    p2 := &i
    fmt.Println(*p2) // 0

    // new со структурой
    type Point struct{ X, Y int }
    pt := new(Point)
    fmt.Println(pt)  // &{0 0}
    pt.X = 10
    fmt.Println(*pt) // {10 0}
}

make() vs new() в Go

Обе функции выделяют память, но для принципиально разных целей. new(T) выделяет память под нулевое значение типа T и возвращает указатель *T. make(T, args) создаёт и инициализирует внутренние структуры данных для трёх специальных встроенных типов: слайсов, мап и каналов — и возвращает само значение (не указатель).

make() — инициализация slice, map, channel

package main

import "fmt"

func main() {
    // Slice: make([]T, len, cap)
    s := make([]int, 3, 10)
    fmt.Println(s, len(s), cap(s)) // [0 0 0] 3 10

    // Map: make(map[K]V) или make(map[K]V, initialCapacity)
    m := make(map[string]int, 100) // предварительно выделяет bucket'ы для ~100 элементов
    m["a"] = 1
    fmt.Println(m) // map[a:1]

    // Channel: make(chan T) или make(chan T, bufferSize)
    ch := make(chan string, 5) // буферизованный канал на 5 сообщений
    ch <- "hello"
    fmt.Println(<-ch) // hello
}

Ключевые отличия

  • new(T) возвращает указатель *T; make(T) возвращает значение типа T.
  • new работает с любым типом; make — только со slice, map и channel.
  • new только обнуляет память; make инициализирует внутренние метаданные (длина, ёмкость, указатель на массив для slice; хэш-таблица для map; буфер для channel).
  • Карта, созданная через new(map[K]V), равна nil и запись в неё вызовет панику — нужен make.

Распространённые ошибки

// WRONG: nil map — паника при записи
p := new(map[string]int)
(*p)["key"] = 1 // panic: assignment to entry in nil map

// RIGHT:
m := make(map[string]int)
m["key"] = 1

// WRONG: slice через new — нет длины и ёмкости
sp := new([]int)
fmt.Println(len(*sp)) // 0, но нет capacity — append работает, но это awkward

// RIGHT:
sl := make([]int, 0, 10)
sl = append(sl, 1, 2, 3)

Когда использовать new()

На практике new() используется редко — чаще пишут &T{} для инициализации структуры и получения указателя. new() полезен, когда нужен указатель на встроенный тип (int, bool, string) без создания переменной:

// Pointer to bool — удобно для optional-полей в JSON/protobuf
func boolPtr(b bool) *bool { return &b } // ещё лаконичнее

// Или через new:
enabled := new(bool)
*enabled = true

Подводные камни

  • nil map при использовании new: new(map[K]V) создаёт указатель на nil-карту, запись в которую вызывает панику.
  • Инициализация канала через new: new(chan int) создаёт указатель на nil-канал; отправка в nil-канал блокируется вечно.
  • make не для структур: попытка вызвать make(MyStruct) — ошибка компиляции; для структур используйте new или литерал.
  • cap > len в make: при make([]int, 5, 10) элементы [5:10] существуют в памяти, но недоступны без append или re-slice — неявный источник багов.
  • Начальная ёмкость map: hint в make(map[K]V, n) — лишь подсказка, не гарантия; map всё равно растёт, но с меньшим числом rehash-операций.
  • Путаница new vs &T{}: оба эквивалентны для структур, но &T{field: val} позволяет инициализировать поля, а new(T) — нет.
  • Escape analysis: и new, и make могут выделять память на стеке (если компилятор доказал, что значение не уходит на heap) — не предполагайте, что это всегда heap-аллокация.

Типичные ошибки

  • Путать возвращаемые типы new и make.
  • Не понимать особую роль make для map/slice/channel.
  • Игнорировать nil map после new.

Что проверяет интервьюер

  • Может объяснить разницу на map или channel без заученной фразы.
  • Знает, что make возвращает готовое значение, а не указатель.
  • Понимает связь make с длиной и ёмкостью slice.

Как вы знаете этот вопрос?

Проверить себя по теме Go →

Источники

  • https://go.dev/doc/effective_go
  • https://go.dev/ref/spec
←Предыдущий вопросКак работает планировщик Go? Что такое модель многопоточности M:N (GOMAXPROCS)?Следующий вопрос→Что такое generics в Go (появились в Go 1.18) и как использовать type constraints?

Связанные темы

Golanguage-fundamentalsmemory-awarenesstechnical-reasoning

Вакансии с этим навыком

Go вакансии
  • Project Controls Engineer (PCE)
  • Director, Forward Deployed Engineering
  • Senior Staff Engineer, Software Defined Dataplane
  • Staff Engineer, Product Software
  • AI Developer Intern

Частые вопросы на собеседовании

  • Для каких задач Go (Golang) является сильным выбором, а где лучше честно выбрать другой язык?
  • Как писать unit-тесты в Go? Что такое пакет testing?
  • Что происходит при добавлении элементов за пределы ёмкости slice?
  • Как Go управляет пакетами и модулями? Что такое go.mod?