Сегодня мы разберем наиболее популярные вопросы по языку программирования Go, опубликованные в Twitter и Facebook. Кроме того, мы дадим ответы и пояснения ко всем четырнадцати вопросам.
Для каждого отрывка кода, приведенного ниже, нужно понять, что он выведет. Итак, давайте приступать!
package main import ( "fmt" ) func hello() []string { return nil } func main() { h := hello if h == nil { fmt.Println("nil") } else { fmt.Println("not nil") } }
Варианты ответа:
Правильный ответ – not nil
В строке 12 мы присваиваем переменной h
функцию hello()
, а не возвращаемое ею значение. Следовательно, h
не равно нулю, и программа напечатает not nil
.
package main import ( "fmt" "strconv" ) func main() { i := 2 s := "1000" if len(s) > 1 { i, _ := strconv.Atoi(s) i = i + 5 } fmt.Println(i) }
Варианты ответа:
Правильный ответ – 2.
Самая сложная часть данной задачки – строка номер 12. Выражение i, _ := strconv.Atoi(s)
создает новую переменную i
, область действия которой находится только внутри оператора if
.
Переменная i
, которая печатается в строке номер 15, на самом деле является той, которую мы определили в строке номер 9, а не той, которая была определена в строке номер 12. Следовательно, данная программа напечатает 2.
package main import ( "fmt" ) func hello(num ...int) { num[0] = 18 } func main() { i := []int{5, 6, 7} hello(i...) fmt.Println(i[0]) }
Варианты ответа:
Правильный ответ – 18.
Срез i
передается в функцию hello()
с переменным числом аргументов в строке номер 13. Чтобы узнать, почему так происходит, можно прочитать следующую статью. Изменения, внесенные в срез внутри функции, видны вызывающей стороне. Следовательно, строка номер 14 нашего кода выведет значение 18.
package main import ( "fmt" ) func main() { a := [2]int{5, 6} b := [2]int{5, 6} if a == b { fmt.Println("equal") } else { fmt.Println("not equal") } }
Варианты ответа:
Правильный ответ – equal.
Массивы — это типы значений в Go, и их можно сравнивать. Два значения массива равны, если равны их соответствующие элементы. В нашем случае a
и b
равны, поэтому программа выводит значение equal
.
package main import "fmt" type rect struct { len, wid int } func (r rect) area() { fmt.Println(r.len * r.wid) } func main() { r := &rect{len: 5, wid: 6} r.area() }
Варианты ответа:
Правильный ответ – 30.
Эта программа отлично скомпилируется и напечатает нам 30.
В строке номер 14 программы, приведенной выше, мы присваиваем адрес rect
переменной r
. Вам может быть интересно, почему программа сработала, если мы не использовали (*r).area()
в строке номер 15. Поскольку у area()
есть получатель значения, Go интерпретирует r.area()
как (*r).area()
, и, следовательно, эта программа прекрасно работает :).
package main import ( "fmt" ) func main() { a := [5]int{1, 2, 3, 4, 5} t := a[3:4:4] fmt.Println(t[0]) }
Варианты ответа:
Правильный ответ – 4.
Выражение a[low : high : max]
создает срез того же типа, с той же длиной и элементами, что и обычное выражение среза a[low : high]
. Кроме того, он контролирует емкость результирующего слайса, устанавливая его на максимальное или низкое значение. Следовательно, срез t
в строке номер 9 содержит один элемент 4 и имеет емкость 1.
package main import ( "fmt" ) type person struct { name string } func main() { var m map[person]int p := person{"mike"} fmt.Println(m[p]) }
Варианты ответа:
Правильный ответ – 0.
Когда мы пытаемся напечатать элемент, которого нет в map
, печатается нулевое значение элемента. В нашем случае m
— это переменная типа map
, а именно map[person]int
. Поскольку в map
нет p
, печатается нулевое значение типа int
, т.е. 0.
package main import ( "fmt" ) func main() { i := 65 fmt.Println(string(i)) }
Варианты ответа:
Правильный ответ – А.
Значение Unicode для A равно 65. Следовательно, когда i
приводится к строковому типу в строке номер 9 нашего кода, мы получаем букву А.
package main import ( "fmt" ) func main() { a := 5 b := 8.1 fmt.Println(a + b) }
Варианты ответа:
Правильный ответ – ошибка компиляции.
a
имеет тип int
, а b
— тип float64
. Мы пытаемся сложить int
и float64
в строке номер 10. Это недопустимо, потому программа не скомпилируется. Мы получим ошибку: ./prog.go:10:16: invalid operation: a + b (mismatched types int and float64)
.
package main import ( "fmt" ) func main() { var i interface{} if i == nil { fmt.Println("nil") return } fmt.Println("not nil") }
Варианты ответа:
Правильный ответ – nil.
Пустой интерфейс имеет базовое значение и конкретный тип, а именно nil
. Следовательно, переменная i
равна нулю.
package main import ( "fmt" ) func hello(i int) { fmt.Println(i) } func main() { i := 5 defer hello(i) i = i + 10 }
Варианты ответа:
Правильный ответ – 5.
Аргументы отложенной функции оцениваются при выполнении оператора defer
, а не при фактическом вызове функции. Когда в строке номер 12 встречается оператор defer
, значение i
равно 5. Таким образом, эта программа вернет нам значение 5.
package main import ( "fmt" ) func main() { fmt.Printf("%%") }
Варианты ответа:
Правильный ответ – %.
Спецификатор формата %% печатает строчное значение процента %. Следовательно, программа печатает %.
package main import ( "fmt" ) func main() { s := make(map[string]int) delete(s, "h") fmt.Println(s["h"]) }
Варианты ответа:
Правильный ответ – 0.
Функция удаления delete()
в строке номер 9 ничего не возвращает и ничего не делает, если указанный ключ не существует. Поскольку ключ h
не существует, функция удаления ничего не выводит и не приводит к ошибке. В строке номер 10 мы пытаемся напечатать s["h"]
. Поскольку карта s
не имеет ключа h
, она вернет значение по умолчанию типа int
. Следовательно, нам вернется 0.
package main import ( "fmt" ) func main() { i := -5 j := +5 fmt.Printf("%+d %+d", i, j) }
Варианты ответа:
Правильный ответ – -5 +5.
Флаг + в спецификаторе формата %+d
используется для вывода знака для числовых значений. Следовательно, эта программа выводит -5 +5
.
Вот и всё! Мы разобрали с вами 14 часто встречающихся вопросов и ответов по Go.
Надеемся, это было вам полезно! Успехов в написании кода!
Перевод статьи «June 2019 Quiz Answers and Explanation».
Pydantic - это мощная библиотека проверки данных и управления настройками для Python, созданная для повышения…
Python предлагает набор библиотек, удовлетворяющих различные потребности в визуализации, будь то академические исследования, бизнес-аналитика или…
В Python для представления данных в двоичной форме можно использовать байты. Из этой статьи вы…
В этой статье рассказывается о том, что такое Werkzeug и как Flask использует его для…
При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные…
В этом руководстве мы рассмотрим, как добавить социальную аутентификацию с помощью GitHub и Google в…