
Недавно в нашей IT-школе мы запустили новый курс «Golang-разработчик», который полностью готовит специалистов к позиции Junior.
И поэтому отвечаем на самый популярный вопрос: «что должен уметь начинающий Go-разработчик?».
В основном это работа с JSON API и базами данных. Для этого необходимо иметь представление о срезах, структурах… ну и, конечно, какой Go разработчик без горутин? Здесь представлены некоторые ключевые вопросы, которые необходимо знать на собеседовании на позицию go-разработчика.
Готовы? Тогда GO!!!
Как устроен слайс и чем он отличается от массива?
Срезы (slice) в отличие от массивов могут менять свою длину. То есть можно добавлять новые элементы, или удалять уже существующие.
Также в Go имеется оператор среза :
, который позволяет создавать новый срез и содержит указанную последовательность от и до:
// исходный массив
initialUsers := [8]string{"Bob", "Alice", "Kate", "Sam", "Tom",
"Paul", "Mike", "Robert"}
users1 := initialUsers[2:6] // с 3-го по 6-й
users2 := initialUsers[:4] // с 1-го по 4-й
users3 := initialUsers[3:] // с 4-го до конца
fmt.Println(users1) //["Kate", "Sam", "Tom", "Paul"]
fmt.Println(users2) //["Bob", "Alice", "Kate", "Sam"]
fmt.Println(users3) //["Sam", "Tom", "Paul", "Mike", "Robert"]
Что такое горутины и зачем они нужны?
Горутина (goroutine) — это функция, которая выполняется асинхронно. Чтобы запустить горутину нужно лишь написать что-то вроде этого:
go someFunc(args…) {
//тут действия
}()
Весит одна горутина около 4кб. Так что, если у вас 4ГБ оперативной памяти, то можно одновременно запустить немало горутин 🙂
Они нужны, если нам параллельно требуется сделать несколько действий. Например, ваш скрипт должен опросить множество сторонних сервисов и поработать с ответом. А что делать, если некоторые из сервисов долго отвечают? Как говорится, семеро одного не ждут! Каждому по горутине, и тогда не придется ждать «отстающих».
Какие есть способы достать данные из JSON?
Тут можно либо демаршализовать (Unmarshal) JSON и разлить его данные в объект с фиксированной структурой. Либо можно залить данные в пустой интерфейс.
Для всего этого используется json.Unmarshal()
Расскажите об ООП в Golang
Формально оно в Go есть, но не совсем в том виде, в каком оно есть в PHP или Java.
В Go мы создаем структуры (читайте «классы») с определенными полями (свойствами), и далее создаем «экземпляры» этих структур. Методы описываются отдельно, а не внутри структур.
Если в функции есть return, обязательно ли она вернет то, что указано в return?
Мы привыкли, что обычно, если код внутри функции добрался до return
, то на выходе мы получим то, что стоит после return
. Но в Go есть интересная особенность: если есть именованный выходной параметр (параметры), то функция вернет последнее его значение, несмотря на то, что написано в return
.
package main
import "fmt"
// Основной метод
func main() {
// функция возвращает два значения
m, d := calculator(105, 7)
fmt.Println("105 x 7 = ", m)
fmt.Println("105 / 7 = ", d)
}
// функция с именованными аргументами
func calculator(a, b int) (mul int, div int) {
defer func() {
mul = 95
div = 27
}()
// здесь простое назначение т.к. инициализация произошла выше
//функция вернет именно эти переменные
mul = a * b
div = a / b
// здесь у вас есть ключевое слово return
return 1, 2
}
Функция вернет в итоге: 95 и 27.
Вот и все. Желаем успехов на собеседовании!