Недавно моя компания провела тест для одного старого сотрудника на изучение языка Go. Действительно, у меня был некоторый опыт работы с языком Go, но я мало использовал его в повседневной работе. Поэтому мне нужно просмотреть многие базовые знания.

У компании не так много времени, чтобы позволить своему сотруднику просто учиться без большого количества рабочих мест. В процессе обучения я читаю книгу Алана А.А. «Язык программирования Go». Донован и Брайан В. Керниган.

Прочитав книгу, я применил новый метод, которым раньше не пользовался. Я хочу записать что-то, некоторые важные и критические вещи в книгу, когда я читал. Как и эта статья, я хочу записать их и представить метод.

Только страницы, исходные предложения и некоторые инструкции (в скобках):
(Если при написании здесь можно использовать таблицу, как я действительно сделал в своей заметке, было бы намного лучше для чтения)

P10:
Printf глаголы

P22:
Go позволяет простому оператору, такому как объявление локальной переменной, предшествовать условию if
(if err := r.ParseForm(); err != nil {})

P30:
В GO нет такой вещи, как неинициализированная переменная
(как в C++)

P36:
Мы говорим, что x выходит из f
(указатель на переменную внутри func)

Помните о времени жизни переменных
(сохранение указателей на недолговечные объекты внутри долгоживущих объектов предотвратит сборку мусора)

P37:
x, y = y, x+y

P40:
В любом случае преобразование никогда не завершается ошибкой во время выполнения
(преобразование типов)

P46:
(Разница в объеме и сроке службы)

P54:
Встроенная функция len возвращает целое число со знаком.

P56:
Наименьшее положительное целое число, которое не может быть точно представлено в виде числа с плавающей запятой32, невелико.

P57:
nan == nan, nan ‹ nan, nan › nan //"ложь, ложь, ложь"
(nan := math:NaN() //(не-число))

P65
Строки неизменяемы
(Две копии или подстрока строки находятся в одной и той же памяти)

P67
UTF-8 был изобретен Кеном Томпсоном и Робом Пайком, двумя создателями GO
(также Unicode на этой странице)

P69
utf8.RuneCountInString(s)
(len(“啊”)=2)

Цикл диапазона Go при применении к строке неявно выполняет декодирование UTF-8.

P82
Размер массива является частью его типа
([3]int и [4]int — разные типы)

P83
Если тип элемента массива сравним, то и тип массива сравним

P87
Функции Go должны обрабатывать все слайсы нулевой длины одинаково, независимо от того, нулевые они или не нулевые
(s=[]int(nil)//len(s)=0, s==nil
s=[]int{}//len(s)==0, s!=nil)

P88
Функция добавления имеет решающее значение для понимания того, как работают слайсы
(Каждый вызов для добавления проверяет, имеет ли слайс достаточную емкость для хранения новых элементов)

P94
Поиск карты с использованием отсутствующего ключа возвращает нулевое значение для его типа
(age, ok := ages["bob"])

P95
Вы должны выделить карту перед сохранением в ней
(длина нулевой карты равна 0)

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

P104
Если все поля структуры сопоставимы, сама структура сопоставима

Сопоставимые типы структур, как и другие сопоставимые типы, могут использоваться в качестве ключевого типа карты.

P105
Go позволяет объявить поле с типом, но без имени; такие поля называются анонимными полями

P120
Две функции имеют одинаковый тип или сигнатуру, если они имеют одинаковую последовательность типов параметров и одинаковую последовательность типов результатов

Если аргумент содержит какую-либо ссылку, например указатель, срез, карту, функцию или канал
(за исключением того, что эти аргументы передаются по значению)

P121
Реализовано на языке, отличном от Go
(объявление функции без тела)

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

P133
Затем нельзя сравнивать друг с другом или использовать в качестве ключей на карте
(Значения функций можно сравнивать с нулевым значением)

P142
Как вызвать функцию с переменным числом аргументов, когда аргументы уже находятся в срезе: поставьте многоточие после последнего аргумента
(fmt.Println(sum(1, 2, 3, 4))
значения := []int{1, 2, 3, 4}
fmt.Println(sum(values…)))

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

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

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

P150
Префикс Must — это общепринятое соглашение об именах для функции вида
(regexp.MustCompile
template.Must в разделе 4.6)

P151
runtime.Stack
(механизм паники в Go запускает отложенные функции до раскручивания стека)

P152
recovery завершает текущее состояние паники и возвращает значение паники

P157
Часто бывает удобно определить дополнительное поведение для простых типов, таких как числа, строки, срезы, карты и иногда даже функции.

P158
компилятор выполнит неявный оператор &p для переменной. Это работает только для переменных

P159
еще раз суммируйте эти три случая, так как они часто вызывают путаницу.

P161
Встраивание позволяет создавать сложные типы с множеством методов путем композиции нескольких полей.

P162
метод не может получить доступ к ColoredPoint, в который встроен Point
(метод embeded не может получить доступ к родительским приемникам)

P164
Выражение метода, записанное как T.f или (*T).f, где T — тип, дает значение функции с обычным первым параметром, занимающим место получателя.

P175
конкретный тип «является» конкретным типом интерфейса, что означает, что он удовлетворяет интерфейсу

P179
в Go мы можем определять новые абстракции или группы интересов, когда они нам нужны, без изменения объявления конкретного типа.

P182
Нулевое значение для интерфейса имеет компоненты типа и значения, установленные на ноль

P184
Сравните значения интерфейса только в том случае, если вы уверены, что y содержат динамические значения сопоставимых типов
(Риск паники)

P185
Интерфейс, отличный от nil, содержащий нулевой указатель
(значение равно nil, но как значение интерфейса, а не nil)

P193
Строительные блоки в стандартной библиотеке Go достаточно гибкие, поэтому фреймворки часто не нужны
(net/http предоставляет ServeMux)

P212
Переключатель x := x.(тип)
Не допускается переключение

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

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

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

P229
после получения последнего отправленного элемента все последующие операции приема будут продолжаться без блокировки, но дадут нулевое значение
(x, ok := ‹-naturals
язык позволяет нам использовать цикл диапазона для перебора каналов тоже)

P230
Вам не нужно закрывать каждый канал, когда вы закончите с ним
(важно вызывать метод Close для каждого файла, когда вы закончите с ним)

P231
функция возведения в квадрат (выходной канал‹- внутр., вход ‹-канал внутр.)

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

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