Новое предложение: выходят дженерики Go, тип переключателя уже здесь!

Go

Всем привет, я жареная рыба.

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

Нет, я обнаружил, что с дженериками каждый может пойти дальше и поиграть с цветами. Увидел "новое" предложение"proposal: spec: generics: type switch on parametric types", что касается требования переключения типа для типов параметров после добавления дженериков.

Освойте новые знания Го с Fried Fish!

новое предложение

Содержание нового предложения состоит в том, чтобы добавить новый вариант оператора, который позволяет использовать дженерики в операторах switch для дальнейшего ограничения их параметров типа.

Например:

switch type T {
case A1:
case A2, A3:
   ...
}

То есть оператор типа switchТип T может быть параметром универсального типа., тип, соответствующий случаю, может быть любым, включая универсальные типы ограничений.

Предположим, что тип типа T может быть следующим:

interface{
    C
    A
}

Ограничения можно сделать с помощью аппроксимационных элементов дженериков:

    interface{
        C
        A1 | A2 | ... | An
    }

Существует даже новый способ записи случая:

case interface {~T}:

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

фактический случай

Случай 1: Многотипные элементы

type Stringish interface {
	string | fmt.Stringer
}

func Concat[S Stringish](x []S "S Stringish") string {
    switch type S {
    case string:
        ...
    case fmt.Stringer:
        ...
    }
 }

Тип S может поддерживать типы string и fmt.Stringer, и case реализуется соответствующим образом.

Случай 2: приближенные элементы

type Constraint interface {
    ~int | ~int8 | ~string
}

func ThisSyntax[T Constraint]( "T Constraint") {
    switch type T {
    case ~int | ~int8:
        ...
    case ~string:
        ...
    }
}

func IsClearerThanThisSyntax[T Constraint]( "T Constraint") {
    switch type T {
    case interface{~int | ~int8 }:
        ...
    case interface{ ~string }:
        ...
    }
}

Тип T может иметь множество типов, и в программе используются приближенные элементы, то есть базовые типы — int, int8, string, любой из этих типов может удовлетворять этому ограничению.

По этой причине поддерживается тип переключателя, и чехол также поддерживает эту функцию.

Спорный момент

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

Исходное утверждение типа выглядит следующим образом:

switch T.(type) {
case string:
   ...
default:
   ...
}

Дискриминация нового типа выглядит следующим образом:

switch type T {
case A1:
case A2, A3:
   ...
}

На первый взгляд, действительно, утверждение типа может полностью заменить новое, разве это не дублирование строительства и строительных колес?

На самом деле он не полностью заменен. Различия заключаются в следующем:

type ApproxString interface { ~string }

func F[T ApproxString](v T "T ApproxString") {
    switch (interface{})(v).(type) {
    case string:
        fmt.Println(v)
    default:
        panic("脑子没进煎鱼")
    }
}

type MyString string

func main() {
    F(MyString("脑子进煎鱼了"))
}

Видите ли вы разницу и каков ответ?

Ответ таков: паника будет брошена.

Вы можете быть сбиты с толку, в чем проблема? Этот входящий тип "жареной рыбы в мозгу"MyString, базовый тип которогоstringтип, также удовлетворитьApproxStringтип приближения~stringЗапрос, почему не работает...

Основная причина в том, что его тип является интерфейсным, а не строковым. Так пошла паника ветки дефалюта.

Суммировать

Сегодня я расскажу вам последние новости о Go Generics.После того, как предыдущее предложение было объединено, в этом предложении есть некоторые новые разработки. Тем не менее, Go официально заявила, что продолжит продвигать предложение после освоения общей практики.

Я верю, что оригиналswitch.(type)а такжеswitch typeЕсть большая вероятность, что он станет такой же логической обработкой блока на нижнем слое Go, а затем постепенно перейдет.

Цель этого предложения состоит в том, чтобыЧтобы решить некоторые ошибки/требования, возникшие после введения дженериков, для решения которой нужна новая грамматическая структура.

что ты думаешь об этом, добро пожаловать, чтобы оставить сообщение и обменяться в области комментариев :)

Если у вас есть какие-либо вопросы, пожалуйста, оставьте отзыв и обменяйтесь мнениями в области комментариев.Лучшие отношения - это достигать друг друга, твойподобното естьжареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.

Статья постоянно обновляется, вы можете выполнить поиск в WeChat, чтобы прочитать [Жареная рыба в мозгу], эта статьяGitHub GitHub.com/Vicious Genetics/Нет...Он был включен, вы можете посмотреть его, чтобы выучить язык GoИди Изучай Карты и Маршруты, Добро пожаловать в Star, чтобы призвать вас к обновлению.