Сегодня мы разберем наиболее популярные вопросы по языку программирования 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».
Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…
Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…
Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…
В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…
Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…
Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…