TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • flag Russian
    Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Cross Join - канал о разработке

23 Aug, 12:13

Открыть в Telegram Поделиться Пожаловаться

В Go 1.27, который вышел 19 августа, есть несколько любопытных изменений в самом языке.

Дженерики на методах

Раньше методы могли использовать параметры типов своего receiver’а, но не могли объявлять дополнительные. Теперь могут.


type Box[T any] struct {
Value T
}

func (b Box[T]) Map[U any](fn func(T) U) Box[U] {
return Box[U]{Value: fn(b.Value)}
}


Чувствую, теперь будут повсеместно фигачить магические цепочки типа таких:


result := Box[int]{Value: 42}.
Map(strconv.Itoa).
Map(func(s string) int {
return len(s)
})

fmt.Println(result.Value) // 2


С одной стороны, это хорошо для стандартной библиотеки: её API можно будет делать более гибкими. С другой стороны, чем больше обобщённых языковых конструкций, тем больше контекста может понадобиться LLM, чтобы понять, что скрывается за таким выражением.

Кстати, у Google недавно была статья, в которой они утверждали, что Go — чуть ли не лучший язык для LLM.

Интерфейсные методы по-прежнему не могут иметь собственные параметры типов, а generic-метод не может реализовать обычный метод интерфейса


Далее, поля embedded структур теперь инициализируются проще.



type Contact struct {
Email string
Phone string
}

type User struct {
Name string
Contact
}


Раньше приходилось писать так:


user := User{
Name: "Анна",
Contact: Contact{
Email: "anna@example.com",
Phone: "+7 999 000-00-00",
},
}


Теперь можно делать так:


user := User{
Name: "Анна",
Email: "anna@example.com",
Phone: "+7 999 000-00-00",
}


Опять же, меньше писанины, больше магии.

Улучшился вывод типов generic-функций

Например, есть функция, которая превращает значение в строку:


func FormatValue[T any](value T) string {
return fmt.Sprint(value)
}


И мы хотим добавить её в список форматтеров.

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


formatters := map[string]func(int) string{
"default": FormatValue[int],
"hex": func(value int) string {
return fmt.Sprintf("0x%x", value)
},
}


В Go 1.27 можно не писать [int]


formatters := map[string]func(int) string{
"default": FormatValue,
"hex": func(value int) string {
return fmt.Sprintf("0x%x", value)
},
}


Компилятор видит, что значения map должны иметь тип func(int) string, и сам выводит для FormatValue параметр T = int.

Не знаю, честно говоря, насколько это всё важно, потому что код пишет теперь LLM, а ему и так было норм 🙂

Интереснее то, что наконец-то затащили json/v2, который тупо в разы быстрее при анмаршаллинге.

1.6k 0 7 2 16
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot