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».

  • 0 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован.

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

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

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