Вербальные изменения поведения
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