Share This
Связаться со мной
Крути в низ
Categories
//Вопросы и ответы по Go

Вопросы и ответы по Go

24.03.2022Category : Python

Сегодня мы разберем наиболее популярные вопросы по языку программирования Go, опубликованные в Twitter и Facebook. Кроме того, мы дадим ответы и пояснения ко всем четырнадцати вопросам.

Для каждого отрывка кода, приведенного ниже, нужно понять, что он выведет. Итак, давайте приступать!

voprosy i otvety po go 72af44a - Вопросы и ответы по Go

Вопрос 1

package main  import (       "fmt" )  func hello() []string {       return nil }  func main() {       h := hello     if h == nil {         fmt.Println("nil")     } else {         fmt.Println("not nil")     } }

Варианты ответа:

  1. nil (ноль)
  2. not nil (не ноль)
  3. compilation error (ошибка компиляции)

Правильный ответ – not nil 

В строке 12 мы присваиваем переменной h функцию hello(), а не возвращаемое ею значение. Следовательно, h не равно нулю, и программа напечатает not nil.

Вопрос 2

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) }

Варианты ответа:

  1. 1005 
  2. Ошибка компиляции

Правильный ответ – 2.

Самая сложная часть данной задачки – строка номер 12. Выражение i, _ := strconv.Atoi(s) создает новую переменную i, область действия которой находится только внутри оператора if. Переменная i, которая печатается в строке номер 15, на самом деле является той, которую мы определили в строке номер 9, а не той, которая была определена в строке номер 12. Следовательно, данная программа напечатает 2.

Вопрос 3

package main  import (       "fmt" )  func hello(num ...int) {       num[0] = 18 }  func main() {       i := []int{5, 6, 7}     hello(i...)     fmt.Println(i[0]) }

Варианты ответа:

  1. 18
  2. 5
  3. Ошибка компиляции

Правильный ответ – 18.

Срез i передается в функцию hello() с переменным числом аргументов в строке номер 13. Чтобы узнать, почему так происходит, можно прочитать следующую статью. Изменения, внесенные в срез внутри функции, видны вызывающей стороне. Следовательно, строка номер 14 нашего кода выведет значение 18.

Вопрос 4

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")     } }

Варианты ответа:

  1. compilation error (ошибка компиляции)
  2. equal (равно)
  3. not equal (не равно)

Правильный ответ – equal.

Массивы — это типы значений в Go, и их можно сравнивать. Два значения массива равны, если равны их соответствующие элементы. В нашем случае a и b равны, поэтому программа выводит значение equal.

Вопрос 5

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() }

Варианты ответа:

  1. Ошибка компиляции
  2. 30

Правильный ответ – 30.

Эта программа отлично скомпилируется и напечатает нам 30.

В строке номер 14 программы, приведенной выше, мы присваиваем адрес rect переменной r. Вам может быть интересно, почему программа сработала, если мы не использовали (*r).area() в строке номер 15. Поскольку у area() есть получатель значения, Go интерпретирует r.area() как (*r).area(), и, следовательно, эта программа прекрасно работает :).

Вопрос 6

package main  import (       "fmt" )  func main() {       a := [5]int{1, 2, 3, 4, 5}     t := a[3:4:4]     fmt.Println(t[0]) }

Варианты ответа:

  1. 3
  2. 4
  3. Ошибка компиляции

Правильный ответ – 4.

Выражение a[low : high : max] создает срез того же типа, с той же длиной и элементами, что и обычное выражение среза a[low : high]. Кроме того, он контролирует емкость результирующего слайса, устанавливая его на максимальное или низкое значение. Следовательно, срез t в строке номер 9 содержит один элемент 4 и имеет емкость 1.

Вопрос 7

package main  import (       "fmt" )  type person struct {       name string }  func main() {       var m map[person]int     p := person{"mike"}     fmt.Println(m[p]) }

Варианты ответа:

  1. Ошибка компиляции
  2. 0
  3. 1

Правильный ответ – 0.

Когда мы пытаемся напечатать элемент, которого нет в map, печатается нулевое значение элемента. В нашем случае m — это переменная типа map, а именно map[person]int. Поскольку в map нет p, печатается нулевое значение типа int, т.е. 0.

Вопрос 8

package main  import (       "fmt" )  func main() {       i := 65     fmt.Println(string(i)) }

Варианты ответа:

  1. А
  2. 65
  3. Ошибка компиляции

Правильный ответ – А.

Значение Unicode для A равно 65. Следовательно, когда i приводится к строковому типу в строке номер 9 нашего кода, мы получаем букву А.

Вопрос 9

package main  import (       "fmt" )  func main() {       a := 5     b := 8.1     fmt.Println(a + b) }

Варианты ответа:

  1. 13.1
  2. 13
  3. Ошибка компиляции

Правильный ответ – ошибка компиляции.

a имеет тип int, а b — тип float64. Мы пытаемся сложить int и float64 в строке номер 10. Это недопустимо, потому программа не скомпилируется. Мы получим ошибку: ./prog.go:10:16: invalid operation: a + b (mismatched types int and float64).

Вопрос 10

package main  import (       "fmt" )  func main() {       var i interface{}     if i == nil {         fmt.Println("nil")         return     }     fmt.Println("not nil") }

Варианты ответа:

  1. nil
  2. not nil 
  3. Ошибка компиляции

Правильный ответ – nil.

Пустой интерфейс имеет базовое значение и конкретный тип, а именно nil. Следовательно, переменная i равна нулю.

Вопрос 11

package main  import (       "fmt" )  func hello(i int) {       fmt.Println(i) } func main() {       i := 5     defer hello(i)     i = i + 10 }

Варианты ответа:

  1. 5
  2. 15

Правильный ответ – 5.

Аргументы отложенной функции оцениваются при выполнении оператора defer, а не при фактическом вызове функции. Когда в строке номер 12 встречается оператор defer, значение i равно 5. Таким образом, эта программа вернет нам значение 5.

Вопрос 12

package main  import (       "fmt" )  func main() {       fmt.Printf("%%") }

Варианты ответа:

  1. 0.0 
  2. Ошибка компиляции
  3. %

Правильный ответ – %.

Спецификатор формата %% печатает строчное значение процента %. Следовательно, программа печатает %.

Вопрос 13

package main  import (       "fmt" )  func main() {       s := make(map[string]int)     delete(s, "h")     fmt.Println(s["h"]) }

Варианты ответа:

  1. runtime panic 
  2. compilation error

Правильный ответ – 0.

Функция удаления delete() в строке номер 9 ничего не возвращает и ничего не делает, если указанный ключ не существует. Поскольку ключ h не существует, функция удаления ничего не выводит и не приводит к ошибке. В строке номер 10 мы пытаемся напечатать s[«h»]. Поскольку карта s не имеет ключа h, она вернет значение по умолчанию типа int. Следовательно, нам вернется 0.

Вопрос 14

package main  import (       "fmt" )  func main() {       i := -5     j := +5     fmt.Printf("%+d %+d", i, j) }

Варианты ответа:

  1. -5 +5
  2. +5 +5
  3. 0 0

Правильный ответ – -5 +5.

Флаг + в спецификаторе формата %+d используется для вывода знака для числовых значений. Следовательно, эта программа выводит -5 +5.

Заключение

Вот и всё! Мы разобрали с вами 14 часто встречающихся вопросов и ответов по Go.

Надеемся, это было вам полезно! Успехов в написании кода!

Перевод статьи «June 2019 Quiz Answers and Explanation».

  • 2 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Связаться со мной
Close