2 изменения языка для Go 1.21

Вербальные изменения поведения

Go 1.20 был выпущен в феврале этого года, а Go 1.21 не за горами, давайте сначала заблокируем его и посмотрим на некоторые интересные изменения в версии Go 1.21.

В конце статьи прилагаются 2 вопроса для интервью.

паника (ноль)

func main() {
    
    
  defer func() {
    
    
    print(recover() == nil)
  }()
  panic(nil)
}

Давайте сначала подумаем, что выведет этот код? истинно или ложно.

Выводит true в Go 1.20 и более ранних версиях.

Но начиная с Go 1.21 он будет выводить false. Это потому, что Go 1.21 определяет новый тип *runtime.PanicNilError.

panic(nil)После этого будет возвращена переменная recover()типа *runtime.PanicNilErrorи значения.Подробности см. в следующем коде:panic called with nil argument

func main() {
    
    
	defer func() {
    
    
		r := recover()
		fmt.Printf("%T\n", r) // *runtime.PanicNilError
		fmt.Println(r) // panic called with nil argument
	}()
	panic(nil)
}

четкая функция

Go 1.21 добавит функцию очистки для очистки элементов на картах и ​​срезах. Пример кода выглядит следующим образом:

package main

import "fmt"

var x = 0.0
var nan = x / x

func main() {
    
    
	s := []int{
    
    1, 2, 3}
	clear(s)
	fmt.Println(s) // [0 0 0]

	m := map[float64]int{
    
    0.1: 9}
	m[nan] = 5
	clear(m)
	fmt.Println(len(m)) // 0
}

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

// Встроенная функция clear очищает карты и срезы.

// Для карт при очистке удаляются все записи, в результате чего карта становится пустой.

// Для слайсов Clear устанавливает все элементы до длины среза

// к нулевому значению соответствующего типа элемента. Если аргумент

// тип является параметром типа, набор типов параметра типа должен

// содержат только типы карт или срезов, и операция очистки выполняется

// подразумевается аргументом типа.

func clear[T ~[]Type | ~map[Type]Type1](t T «T ~[]Type | ~map[Type]Type1»)

Для карты вызов функции очистки очистит элементы карты и станет пустой картой.

Для среза вызов функции очистки сохранит длину исходного среза неизменной и изменит значение элементов внутри на нулевое значение типа элемента среза.

вопросы интервью

Семантика отсрочки часто используется разработчиками Go, и с ней проще всего разобраться в ошибках.

Давайте посмотрим на результаты следующих двух программ об отсрочке.

package main

import "fmt"

func f() {
    
    
	defer func() {
    
    
		defer func() {
    
     recover() }()
		defer recover()
		panic(2)
	}()
	panic(1)
}

func main() {
    
    
	defer func() {
    
     fmt.Print(recover()) }()
	f()
}
  • А: 2
  • Б: 1
  • C: Нил
  • D: выдать исключение паники
package main

import "fmt"

func main() {
    
    
	for i := 0; i < 3; i++ {
    
    
		defer func() {
    
     print(i) }()
	}
	for i := range [3]int{
    
    } {
    
    
		defer func() {
    
     print(i) }()
	}
}

  • А: 222333
  • Б: 210333
  • К: 333333
  • Д: 210210

Если вы хотите узнать ответ, отправьте сообщение 121на официальный аккаунт.

рекомендуемое чтение

адрес с открытым исходным кодом

Статьи и примеры кода с открытым исходным кодом доступны на GitHub: Go Language Beginner, Intermediate и Advanced Tutorials .

Официальный аккаунт: расширенное кодирование. Подпишитесь на официальную учетную запись, чтобы получать последние вопросы интервью Go и стек технологий.

Персональный сайт: Блог Цзиньчэна .

Чжиху: Уцзи .

Благосостояние

Я собрал для вас подарочный набор учебных материалов по бэкенд-разработке, включая введение в языки программирования для углубленного изучения (Go, C++, Python), стек технологий бэкенд-разработки, вопросы для интервью и т. д.

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

Рекомендации

  • https://twitter.com/go100and1
  • https://twitter.com/go100and1/status/1623546829773361152

Supongo que te gusta

Origin blog.csdn.net/perfumekristy/article/details/129099919
Recomendado
Clasificación