Один из вопросов на общие знания, которые вы вряд ли когда-то будете использовать в go - это вопрос "Что такое фигурные скобки с не объявленным оператором в go функции?".
Ответ
В go функции действительно можно объявить{} без оператора, ограничив область видимости куска кода в рамках этой функции.
Ответ
В go функции действительно можно объявить{} без оператора, ограничив область видимости куска кода в рамках этой функции.
Операторы в Golang
Про операторы в go в основном спрашивают на код секциях, к примеру захват переменной в цикле и так далее. Но все же, однажды попался следующий вопрос.
"В go есть оператор switch case, можно ли выполнить несколько условий в одном объявленном операторе?"
Ответ
Такое возможно благодаря ключевому слову fallthrough. Оно заставляет выполнять код в следующей объявленной булевой секции, вне зависимости подходит ли булевое условие case этой секции.
Про операторы в go в основном спрашивают на код секциях, к примеру захват переменной в цикле и так далее. Но все же, однажды попался следующий вопрос.
"В go есть оператор switch case, можно ли выполнить несколько условий в одном объявленном операторе?"
Ответ
Такое возможно благодаря ключевому слову fallthrough. Оно заставляет выполнять код в следующей объявленной булевой секции, вне зависимости подходит ли булевое условие case этой секции.
"Как можно оперировать строками?"
Ответ
Строки в go можно складывать(конкатенировать). Для многих операций есть стандартные пакеты, к примеру strings, fmt. Кроме того, надо понимать, что все варианты конкатенации имеют свою производительность. Подробнее о производительности мы поговорим в рамках последующих статей, в которых будут тестовые задания.
Ответ
Строки в go можно складывать(конкатенировать). Для многих операций есть стандартные пакеты, к примеру strings, fmt. Кроме того, надо понимать, что все варианты конкатенации имеют свою производительность. Подробнее о производительности мы поговорим в рамках последующих статей, в которых будут тестовые задания.
"Что будет если сложить строки?"
Ответ
Ранее мы говорили о том что, строки - это массивы байт. Из этого следует, что при работе со строками (конкатенация и тд) мы будем получать новые строки.
Ответ
Ранее мы говорили о том что, строки - это массивы байт. Из этого следует, что при работе со строками (конкатенация и тд) мы будем получать новые строки.
"Как определить количество символов для строки?" или "Какие есть нюансы при итерации по строке?"
Ответ
Исходя из того же знания, что строка это массив байт, взяв базовую функцию len() от строки мы получим количество байт. Похожее поведение будет при итерации по строке - итерация по байтам. Тогда как в зависимости от кодировки, символ в строке может занимать не один байт.
Для того, чтобы работать именно с символами, необходимо преобразовать строку в тип []rune.
Еще одним способом определения длинны строки является функция RuneCountInString пакета utf8.
Ответ
Исходя из того же знания, что строка это массив байт, взяв базовую функцию len() от строки мы получим количество байт. Похожее поведение будет при итерации по строке - итерация по байтам. Тогда как в зависимости от кодировки, символ в строке может занимать не один байт.
Для того, чтобы работать именно с символами, необходимо преобразовать строку в тип []rune.
Еще одним способом определения длинны строки является функция RuneCountInString пакета utf8.
Int в Golang
"Какие численные типы есть в go?"
Ответ
Тут достаточно перечислить:
int/int8/int16/int32/int64;
uint/uint8/uint16/uint32/uint64;
float32/float64;
complex64/complex128;
rune(int32).
"Какие численные типы есть в go?"
Ответ
Тут достаточно перечислить:
int/int8/int16/int32/int64;
uint/uint8/uint16/uint32/uint64;
float32/float64;
complex64/complex128;
rune(int32).
"Чем отличается int от uint?"
Ответ
int содержит диапазон от отрицательных значений до положительных, тогда как uint - это диапазон от 0 в строну увеличения положительных значений.
Пример: int64 это диапазон от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 , uint64 от 0 до 18 446 744 073 709 551 615.
Ответ
int содержит диапазон от отрицательных значений до положительных, тогда как uint - это диапазон от 0 в строну увеличения положительных значений.
Пример: int64 это диапазон от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 , uint64 от 0 до 18 446 744 073 709 551 615.
"Что такое обычный int и какие есть нюансы его реализации?"
Ответ
В зависимости от того какая архитектура платформы, на которой мы стартуем, компилятор преобразует int в int32 для 32 разрядной архитектуры и в int64 для 64 разрядной архитектуры.
Ответ
В зависимости от того какая архитектура платформы, на которой мы стартуем, компилятор преобразует int в int32 для 32 разрядной архитектуры и в int64 для 64 разрядной архитектуры.
"Как преобразовать строку в int и наоборот? Можно ли сделать int(string) и string(int) соответственно?"
Ответ
Преобразование типов между int и string указанным синтаксисом невозможно. Для преобразования необходимо использовать функции из пакета strconv стандартной библиотеки go.
При этом для преобразования строк в/из int и int64 используются разные функции, strconv.Atoi и strconv.Itoa для int, strconv.ParseInt и strconv.FormatInt соответственно.
Ответ
Преобразование типов между int и string указанным синтаксисом невозможно. Для преобразования необходимо использовать функции из пакета strconv стандартной библиотеки go.
При этом для преобразования строк в/из int и int64 используются разные функции, strconv.Atoi и strconv.Itoa для int, strconv.ParseInt и strconv.FormatInt соответственно.
"Сколько в памяти занимают реализации int32 и int64?"
Ответ
Из самого названия типа следует, что int32 занимает 4 байта (32/8), int64 занимает 8 байтов (64/8).
Ответ
Из самого названия типа следует, что int32 занимает 4 байта (32/8), int64 занимает 8 байтов (64/8).
"Какие предельные значения int32 и int64?"
Ответ
В предыдущем вопросе мы отвечали сколько места в памяти занимают эти типы. Таким образом с помощью 4 или 8 байт можно закодировать разные по диапазону значения.
Для int64 это диапазон от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, для int32 от –2 147 483 648 до 2 147 483 647.
Ответ
В предыдущем вопросе мы отвечали сколько места в памяти занимают эти типы. Таким образом с помощью 4 или 8 байт можно закодировать разные по диапазону значения.
Для int64 это диапазон от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, для int32 от –2 147 483 648 до 2 147 483 647.
"Какой результат получим если разделить int на 0 и float на 0?"
Ответ
Это вопрос с подвохом. Деление int на 0 в go невозможно и вызовет ошибку компилятора. Тогда как деление float на 0 дает в своем результате бесконечность.
Ответ
Это вопрос с подвохом. Деление int на 0 в go невозможно и вызовет ошибку компилятора. Тогда как деление float на 0 дает в своем результате бесконечность.
Const в Golang
"Что такое константы и можно ли их изменять?"
Ответ
Константы - это неизменяемые переменные, изменить константу нельзя.
"Что такое константы и можно ли их изменять?"
Ответ
Константы - это неизменяемые переменные, изменить константу нельзя.
"Что такое iota?"
Ответ
iota - идентификатор, который позволяет создавать последовательные не типизированные целочисленные константы. Значением iota является индекс ConstSpec. Не смотря на то, что первым индексом является 0, значение первой константы можно задать отличным от 0, что в свою очередь повлияет на значения последующих констант.
Ответ
iota - идентификатор, который позволяет создавать последовательные не типизированные целочисленные константы. Значением iota является индекс ConstSpec. Не смотря на то, что первым индексом является 0, значение первой константы можно задать отличным от 0, что в свою очередь повлияет на значения последующих констант.
Array и slice в Golang
Самый популярный вопрос на собеседовании на любую позицию go инженера - "Что такое слайс и чем он отличается от массива?".
Ответ
type slice struct {
array unsafe.Pointer
len int
cap int
}
Самый популярный вопрос на собеседовании на любую позицию go инженера - "Что такое слайс и чем он отличается от массива?".
Ответ
type slice struct {
array unsafe.Pointer
len int
cap int
}
"Как работает базовая функция append для go?"
Ответ
Функция принимает на вход слайс и переменное количество элементов для добавления в слайс. Append расширяет слайс за пределы его len, возвращая при этом новый слайс.
Если количество элементов, которые мы добавляем в слайс, не будет превышать cap, вернется новый слайс, который ссылается на тот же базовый массив, что и предыдущий слайс. Если количество добавляемых элементов превысит cap, то вернется новый слайс, базовым для которого будет новый массив.
func append(slice []Type, elems ...Type) []Type
Ответ
Функция принимает на вход слайс и переменное количество элементов для добавления в слайс. Append расширяет слайс за пределы его len, возвращая при этом новый слайс.
Если количество элементов, которые мы добавляем в слайс, не будет превышать cap, вернется новый слайс, который ссылается на тот же базовый массив, что и предыдущий слайс. Если количество добавляемых элементов превысит cap, то вернется новый слайс, базовым для которого будет новый массив.
func append(slice []Type, elems ...Type) []Type
В чем отличие протоколов TCP и UDP? В каком случае UDP предпочтительнее?
Ответ
TCP – транспортный протокол передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью.
UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети.
Разница между протоколами TCP и UDP – в так называемой "гарантии доставки". TCP требует отклика от клиента, которому доставлен пакет данных, подтверждения доставки, и для этого ему необходимо установленное заранее соединение. Также протокол TCP считается надежным, тогда как UDP получил даже именование “протокол ненадежных датаграмм. TCP исключает потери данных, дублирование и перемешивание пакетов, задержки. UDP все это допускает, и соединение для работы ему не требуется. Процессы, которым данные передаются по UDP, должны обходиться полученным, даже и с потерями. TCP контролирует загруженность соединения, UDP не контролирует ничего, кроме целостности полученных датаграмм.
С другой стороны, благодаря такой не избирательности и бесконтрольности, UDP доставляет пакеты данных (датаграммы) гораздо быстрее, потому для приложений, которые рассчитаны на широкую пропускную способность и быстрый обмен, UDP можно считать оптимальным протоколом. К таковым относятся сетевые и браузерные игры, а также программы просмотра потокового видео и приложения для видеосвязи (или голосовой): от потери пакета, полной или частичной, ничего не меняется, повторять запрос не обязательно, зато загрузка происходит намного быстрее. Протокол TCP, как более надежный, с успехом применяется даже в почтовых программах, позволяя контролировать не только трафик, но и длину сообщения и скорость обмена трафиком.
@golang_interview
Ответ
TCP – транспортный протокол передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью.
UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети.
Разница между протоколами TCP и UDP – в так называемой "гарантии доставки". TCP требует отклика от клиента, которому доставлен пакет данных, подтверждения доставки, и для этого ему необходимо установленное заранее соединение. Также протокол TCP считается надежным, тогда как UDP получил даже именование “протокол ненадежных датаграмм. TCP исключает потери данных, дублирование и перемешивание пакетов, задержки. UDP все это допускает, и соединение для работы ему не требуется. Процессы, которым данные передаются по UDP, должны обходиться полученным, даже и с потерями. TCP контролирует загруженность соединения, UDP не контролирует ничего, кроме целостности полученных датаграмм.
С другой стороны, благодаря такой не избирательности и бесконтрольности, UDP доставляет пакеты данных (датаграммы) гораздо быстрее, потому для приложений, которые рассчитаны на широкую пропускную способность и быстрый обмен, UDP можно считать оптимальным протоколом. К таковым относятся сетевые и браузерные игры, а также программы просмотра потокового видео и приложения для видеосвязи (или голосовой): от потери пакета, полной или частичной, ничего не меняется, повторять запрос не обязательно, зато загрузка происходит намного быстрее. Протокол TCP, как более надежный, с успехом применяется даже в почтовых программах, позволяя контролировать не только трафик, но и длину сообщения и скорость обмена трафиком.
@golang_interview
Как найти максимальное число в массиве на Golang?
Ответ
Чтобы найти максимальное число в массиве, то можно воспользоваться несколькими путями в Golang:
Отсортировать массив и затем взять последний элемент массива
Использовать цикл: берем первый элемент как начальный и затем в цикле сравниваем и если больше, то записываем в максимально значение
@golang_interview
Ответ
Чтобы найти максимальное число в массиве, то можно воспользоваться несколькими путями в Golang:
Отсортировать массив и затем взять последний элемент массива
Использовать цикл: берем первый элемент как начальный и затем в цикле сравниваем и если больше, то записываем в максимально значение
@golang_interview
"Как преобразовать интерфейс к другому типу?"
Ответ
Интерфейс можно преобразовать в базовый тип значения (скастить). Для этого используется синтаксис, возвращающий две переменные, одна из которых булевая.
В случае, если не удалось скастить интерфейс, булевая переменная будет ложной, а переменная базового типа, к которому приводим интерфейс будет равна дефолтному значению этого типа.
@golang_interview
Ответ
Интерфейс можно преобразовать в базовый тип значения (скастить). Для этого используется синтаксис, возвращающий две переменные, одна из которых булевая.
В случае, если не удалось скастить интерфейс, булевая переменная будет ложной, а переменная базового типа, к которому приводим интерфейс будет равна дефолтному значению этого типа.
@golang_interview
Реализуйте функцию SumOfSquares, получающую целое число c и возвращающую сумму всех квадратов между 1 и c. Вам потребуется использовать инструкции select, горутины и каналы.
Например, ввод 5 приведет к возвращению 55, потому что $1² + 2² + 3² + 4² + 5² = 55$.
Ответ :
Рассмотрим функцию SumOfSquares. Сначала на строке 4 мы объявляем переменную y, после чего переходим к циклу For-Select. В инструкциях select прописано два кейса.
case c <- (y*y): служит для отправки квадрата y по каналу c, который принимается в горутине, созданной в основной рутине.
case <-quit: служит для получения сообщения из основной рутины, которое вернется из функции.
@golang_interview - вопросы собеседованний Golang
Например, ввод 5 приведет к возвращению 55, потому что $1² + 2² + 3² + 4² + 5² = 55$.
Ответ :
Рассмотрим функцию SumOfSquares. Сначала на строке 4 мы объявляем переменную y, после чего переходим к циклу For-Select. В инструкциях select прописано два кейса.
case c <- (y*y): служит для отправки квадрата y по каналу c, который принимается в горутине, созданной в основной рутине.
case <-quit: служит для получения сообщения из основной рутины, которое вернется из функции.
@golang_interview - вопросы собеседованний Golang