Изучаем Go. Урок №26. Дженерики(generics)

Поділитися
Вставка
  • Опубліковано 21 гру 2024

КОМЕНТАРІ • 37

  • @richardplantagenet4095
    @richardplantagenet4095 3 дні тому

    Имба. Просто обожаю тебя! Такие темы классные раскрываешь, да еще и так просто. Ты давай там, только не уходи на несколько лет опять. А если словишь синдром самозванца (как раньше) - просто держи в голове факт, что благодаря тебе сотни людей устроились на работу, и живут свою лучшую жизнь.

  • @ДмитрийХорьков-е1я

    Отличный урок, информация подана с примерами, все понятно, нет лишней воды. 10 из 10. Отдельно хочется отметить приятный голос и адекватное качество звука (многие другие каналы подобным не отличаются, в связи с чем слушать и воспринимать информацию куда тяжелее)

  • @xonicov
    @xonicov 3 місяці тому +2

    Ты офигенен!

  • @devKenny
    @devKenny Рік тому +4

    Ну ты красавчик канеш, уважения тебе

  • @sdz4650
    @sdz4650 Рік тому +7

    Уроки полезные, всё кратко, но ёмко. Одно замечание - сделай, пожалуйста, шрифт крупнее, и/или тему более контрастную. Тяжело читать код

  • @luckytima2315
    @luckytima2315 2 роки тому +8

    спасибо большое )) Топовые уроки )

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

    Благодарю за отличный материал !

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

    Спасибо за информацию, доступно.

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

    лучший бро, 10/10

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

    Однозначно лайк, больше обучающих видео по Golang плиз)

  • @l22dev
    @l22dev 2 роки тому +7

    Молодец, хорошо разжовываешь.
    Давай следующий урок по тестированию

  • @nikita.valahanovich8815
    @nikita.valahanovich8815 7 місяців тому

    Красавчик, даже я смог понять)

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

    Спасибо за ролик! Это мой второй подход к дженерикам и на этот раз вышел не с кашей в голове 😊
    Только вот не понял момент с обобщённым типом в функции unionInterfaceAndType() 17:00 . В чем фишка его использовать, если в функции мы все равно явно должны указать какого конкретного типа мы передаём обобщенный тип, ведь при этом придется писать функцию несколько раз для каждого конкретного типа. Или подразумевается, что пишешь в этой функции switch с type assertion и задаешь поведение для каждого конкретного типа? Тогда опять не понятна эта фишка, ведь по идее делаешь всё как раньше .

  • @if_err_not_nil
    @if_err_not_nil 9 місяців тому

    супер! спасибо!

  • @nikitajolobov4591
    @nikitajolobov4591 9 місяців тому

    спасибо тебе за крутое видео!

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

    Спасибо!

  • @barr.mrjohn
    @barr.mrjohn Рік тому

    подписался и ставил лайк.

  • @СергейТ-т8э
    @СергейТ-т8э 2 роки тому +2

    Будут ли еще новые уроки?

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

      Да, но через пару недель)

    • @СергейТ-т8э
      @СергейТ-т8э 2 роки тому

      @@thisisit7267 Большое, большое спасибо за положительный ответ.)

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

      @@thisisit7267 Привет, ждем тебя) Сервис был заявлен) Чистая архитектура, entities, usecases, adapters все дела)

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

      ​@@ruauka Привет, я не пропал😅 Пилю видос, в эти выходные будет. Потом примерно через 2 недели, ибо командировки/отпуск)

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

    Спасибо за урок, выглядят они не привычно ну по сравнению как они выглядят в других языках Rust, C#, Java)
    будто урезанные дженерики в Golang ))))
    вот играюсь с дженериками подскажите пожалуйста есть ли вариант написать функцию Map сразу для слайса и хэш мапы лучше чем это УГ:
    package main
    import (
    "fmt"
    )
    type Collection[T any, K comparable] interface {
    ~[]T | ~map[K]T
    }
    func Map[C Collection[T, K], T any, K comparable](collection C, callback func(item T) T) ([]T, map[K]T) {
    switch t := any(collection).(type) {
    case []T:
    slice := make([]T, 0, len(collection))
    for _, el := range t {
    slice = append(slice, callback(el))
    }
    return slice, nil
    case map[K]T:
    hashMap := make(map[K]T, len(collection))
    for key, el := range t {
    hashMap[key] = callback(el)
    }
    return nil, hashMap
    default:
    return nil, nil
    }
    }
    func main() {
    list := []uint64{1, 2, 3, 4, 5}
    person := make(map[string]string)
    person["leha"] = "blevushkin"
    person["dima"] = "kekin"
    person["alex"] = "ssikin"
    slice, _ := Map[[]uint64, uint64, string](list, func(item uint64) uint64 {
    return item + 1
    })
    fmt.Printf("%T %v
    ", slice, slice)
    _, hashMap := Map[map[string]string, string, string](person, func(item string) string {
    return item + "!"
    })
    fmt.Printf("%T %v
    ", hashMap, hashMap)
    }

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

    Блин, не знаю. Прекрасно всегда обходился без них. Вроде как выглядит полезной фича. Но всегда задачи на go у меня писались под конкретный тип данных.

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

      Я думаю надо подождать, посмотреть. Там со временем может и придумают наиболее подходящие юзкейсы, где абстракция будет более полезна, чем скорость. Например для каких то конфигов при запуске приложения.

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

      наверно конечно можно обходится без них, но когда, например, пишешь какую ни будь структуру данных с ними красивее выглядит чем без них)
      если пишешь библиотечный код без них тоже можно, но с ними будет проще…
      так-то ясно понятно, что без них можно обойтись в некоторых случаях, например, через полиморфизм

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

    В дженериках только одно хорошо, это то что они не нужны, когда нужен быстрый код

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

      Без компромиссов не обошлось) Видимо тут придется выбирать между быстротой работы vs удобство/cкорость написания кода. Да и в целом создание доп. абстракций всегда накладывает некий оверхед

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

      Кстати, Максим, если можно, прикрепите ссылки на бенчмарки, будет интересно посмотреть, ибо я тему производительности в видео не затрагивал)

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

      Как на ютюбе оставлять ссылки?)) Сейчас попробую добавить если автомодерирование пропустит
      В конце статьи можно увидеть bench. Сам глубоко не вникал, но в интернете их сравнивают с значением interface{}, прирост составляет от 10% до 20% в дженериках, правда аллокаций больше

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

      "faster-sorting-with-go-generics" (можно быстро найти в гугле по названию статьи)

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

    очень прошу сделай шрифт побольше

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

    что то я поплыл

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

    Благодарю за видео.
    Но как по мне, от них только вред, теперь будут лепить кто во что горазд)

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

      В целом да, много нового синтаксиса, код становится читать немного сложнее + влияние на производительность. Но идея конечно сама по себе довольно интересная)

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

    non-comparable также функции, интерфейсы