Изучаем Go. Урок №18. Мапы (maps)

Поділитися
Вставка
  • Опубліковано 7 січ 2025

КОМЕНТАРІ • 33

  • @xumoyunturabekov1273
    @xumoyunturabekov1273 2 роки тому +9

    Спасибо, только не останавливаетесь)

    • @thisisit7267
      @thisisit7267  2 роки тому +4

      Пожалуйста. Я постараюсь)

  • @vitaliikaverin3120
    @vitaliikaverin3120 2 роки тому +3

    Спасибо. Быстро и в то же время толково подаешь материал. Молоток )

  • @alexispell4251
    @alexispell4251 2 роки тому +1

    Привет! Во-первых, цикл видео - огонь! Спасибо!
    Но внесу немного полезной критики :)
    19:55
    "Если нам надо найти 10 пользователей, то нам придется итерироваться 10 раз по слайсу, если же мы используем мапу - то мы итерируемся только один раз, превращая мапу в слайс."
    На самом деле, поиск по массиву - всегда итерация, и всегда только одна, от первого элемента к последнему. И найдя элемент - мы завершаем итерацию. Сложность алгоритма - от O(1) (если элемент первый) до O(n) (если элемент последний). Не происходит десяти итераций :)
    А в поиске по мапе - вообще нет итерации. Потому что хипа/ хэш-таблица, мапа, сама по себе всегда гарантирует поиск O(1) из-за того, что ячейка памяти лежит в ключе самой мапы. Вот так вот. Еще раз спасибо за твои видосы!

    • @thisisit7267
      @thisisit7267  2 роки тому

      Добрый день. Говоря про количество итераций для поиска 10 человек, я имел в виду:
      1. Если мы будем итерироваться по слайсу на каждого пользователя (10 пользователей = 10 итераций по слайсу)
      2. Если мы хотим искать в мапе, то ее нужно сначала построить из нашего слайса. Чтобы перенести значения слайса в мапу, нужно проитерироваться по слайсу 1 раз, а уже при поиске обращаться к полученной мапе)

    • @alexispell4251
      @alexispell4251 2 роки тому

      @@thisisit7267 но в этом и смысл, сколько бы ни было в массиве пользователей - итерация одна, а не столько, сколько пользователей в массиве/слайсе🙂

    • @thisisit7267
      @thisisit7267  2 роки тому +2

      ​@@alexispell4251 Кажется мы неверно поняли друг друга, я имел в виду, что если мы вызываем функцию поиска в слайсе (findInSlice) 10 раз, то каждый вызов функции выполняет 1 итерацию. суммарно 10 вызовов: 10 * O(n)
      Если мы построим мапу одной итерацией и 10 раз обратимся к мапе по ключу, то итерация останется только одна, а остальное - обращение к мапе по ключу: 1*O(n) + 10 * O(1)

    • @alexispell4251
      @alexispell4251 2 роки тому +1

      @@thisisit7267 Да, согласен)
      Ещё раз огромный суперлайк за суперконтент по го :3

    • @thisisit7267
      @thisisit7267  2 роки тому

      @@alexispell4251 Спасибо🙂

  • @ИванИванов-с8ц3р
    @ИванИванов-с8ц3р 2 роки тому +5

    Очень годный контент. Спасибо!

  • @andreichemeris4141
    @andreichemeris4141 2 роки тому +3

    подписался, лайк поставил = лайфхак, по использованию мапы отличный ! (как раз был вопрос, как лучше этот инструмент применять)

  • @ИгорьЛукин-и7ж
    @ИгорьЛукин-и7ж 2 роки тому +2

    Идеально, спасибо!)

  • @softdevstankov5570
    @softdevstankov5570 2 роки тому +1

    Спасибо!

  • @pavelmanin9457
    @pavelmanin9457 5 місяців тому

    ну вот я и дошел до темы, которую сложно понять чайнику, кто только начал изучение Го с нуля )

  • @4829888
    @4829888 2 роки тому +1

    Спасибо. Можешь примеры показать с использованием: map[int]bool или map[string]bool

    • @thisisit7267
      @thisisit7267  2 роки тому

      Привет. Тут пример создания мап и установки значений по ключам: go.dev/play/p/79kjGOLJHW5

  • @andk6893
    @andk6893 5 місяців тому +1

    Map как Set со структурой уродливей чем с bool: map[key] = true; if map[key].... Если потеря байта не критична с булевым значением будет читабельней и не нужно использовать ок синтаксис для проверки значения (Jon Bodner O'Really)

  • @4829888
    @4829888 2 роки тому +1

    вы показали вставку значений в количестве 1 шт. можно ли в маппу вставлять (добавлять) несколько значенй с помощью оператора "for"? если да, покажите как это делается на примерах.

    • @thisisit7267
      @thisisit7267  2 роки тому

      Добрый день. За одну операцию мы можем вставить/обновить только одно значение в мапе, используя нужный ключ. Но мы можем выполнить несколько таких одиночных операций в цикле, например вот так: go.dev/play/p/2O-rG4EpmyG

  • @sergeykosovsky7005
    @sergeykosovsky7005 Рік тому

    Где-то читал что в мапе 0(n) - работает как-то сверхбыстро - это так?

  • @sanchosplay9892
    @sanchosplay9892 10 місяців тому

    У меня почему то когда я пишу %T или %#v они не подсвечиваются оранжевым и не выдают нужные значения. Так и печатают %T и %#v. Как пофиксить?

    • @pavelmanin9457
      @pavelmanin9457 5 місяців тому

      может обычный принт используешь? а не принтФ

  • @vitaliikaverin3120
    @vitaliikaverin3120 2 роки тому

    какой смысл в указывании вместимости map? Добавил 2 значения, длина Len 2. Сделал 3, потом 4 человека - Len поменялось на 3, 4. Никаких ограничений или ошибок не выдает. Будто нет значения 3 в map2
    map2 := make(map[string]string, 3)
    fmt.Printf("Type: %T, Value: %#v, Len: %v
    ", map2, map2, len(map2))
    map2 = map[string]string{"1": "Kolya", "2": "Vasya" /*, "3": "Igor", "4": "Vitalya"*/}
    fmt.Printf("Type: %T, Value: %#v, Len: %v
    ", map2, map2, len(map2))
    -------------------
    Type: map[string]string, Value: map[string]string{}, Len: 0
    Type: map[string]string, Value: map[string]string{"1":"Kolya", "2":"Vasya"}, Len: 2

    • @thisisit7267
      @thisisit7267  2 роки тому +1

      Для map len показывает реальное количество элементов внутри, а второй аргумент в make позволяет создать map с уже выделенной памятью под указанное количество элементов. Это в некотором роде указание cap для map, но его нельзя посмотреть через cap.
      Насчет примера с map2 - там же значения с ключами 3 и 4 закомментированы, поэтому их и нет. Код в комментариях не выполняется, поэтому значения в map2 не попали

    • @vitaliikaverin3120
      @vitaliikaverin3120 2 роки тому

      @@thisisit7267 это я закоментировал, просто когда тестировал. Уберу комментарии и Len станет 4 без каких либо ошибок, хотя изначально выделялось память для 3. Вот о чем мой вопрос. Будто второй аргумент в make не несет никакого смысла, т.к. любое добавление или удаление людей просто меняет len у карты.
      слушай, а ты откуда все тонкости знаешь? Учил в универе голанг или через опыт и учебники на работе узнал? Какое образование и опыт у тебя? Потрать минутку на объяснение, чтоб мы знали своих героев ))

    • @thisisit7267
      @thisisit7267  2 роки тому +9

      Внутри мапы данные хранятся разделенные на части, которые называются buckets. Каждый bucket может хранить определенный объем данных. Когда мы указываем вторым аргументом количество, в нашей мапе под капотом создается нужное количество buckets сразу. Если мы этого не делаем изначально, то при дальнейшем добавлении элементов выделяется память в несколько раз больше текущей (как у слайсов), чтобы перенести туда старые элементы и можно было добавлять новые. Таким образом, использование 2 аргумента позволяет нам сэкономить время и память в дальнейшем.
      Про свой опыт расскажу чуть позже, наверное даже в отдельном видосе)

    • @andk6893
      @andk6893 4 місяці тому

      @@vitaliikaverin3120 "просто меняет"... происходит выделение памяти и скорее всего в куче, что довольно трудозатратная операция. Вот почему новичкам таки рекомендуют начинать изучения программирования с Си, чтобы понять что такое стэк, куча и операции выделения и освобождения памяти

  • @igor-grudinin
    @igor-grudinin 6 місяців тому

    То есть, ты считаешь, что взятие элемента по индексу в мапе - это одна операция? )) Что-то мне подсказывает, что под капотом там как раз и происходит перебор массива в цикле. Чудес не бывает!

    • @thisisit7267
      @thisisit7267  6 місяців тому

      Тут больше про среднее время. В среднем это ближе к 0(1), в худшем можем и до O(N) дойти, зависит от хэш функции и числа колллизий

  • @ilyadruzh
    @ilyadruzh Рік тому +1

    Не мара, а отображение или словарь

  • @ilyadruzh
    @ilyadruzh Рік тому +1

    Не кампербл, а сравнимые