Pull to refresh
149.37
AvitoTech
У нас живут ваши объявления

Avito Quiz: Golang

Reading time 3 min
Views 9.2K

Привет! Сегодня продолжаем серию мини-квизов в нашем блоге. Этот выпуск (предыдущий здесь) будет посвящен языку Go — будем считать, что это разминка в преддверие GopherCon Russia 2018 (кстати, у нас на этой конференции будет стенд, и мы планируем несколько интересных активностей).


Под катом — семь вопросов и пара пасхалок. Ответы на вопросы выложим апдейтом к посту в понедельник, 26.02. Если будете решать — кладите ответы под спойлер, чтобы не портить другим фана.


Enjoy!
UPD: пост обновлён, теперь ответы внутри!


1. Что выведет этот код?


package main
import (
    "fmt"
)

func add(arr []int, v int) {
    arr = append(arr, v)
}

func main() {
    arr := make([]int, 0, 100000)
    fmt.Printf("%v %p\n", arr, &arr)
    add(arr, 10)
    fmt.Printf("%v %p\n", arr, &arr)
}

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


  • Пустой массив до вызова add, массив из 1 элемента после. Адреса не совпадают.
  • Оба раза пустой массив. Адреса совпадают.
  • Пустой массив до вызова add, массив из 1 элемента после. Адреса совпадают.
  • Оба раза пустой массив. Адреса не совпадают.

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

Оба раза пустой массив. Адреса совпадают.


2. Что выведет этот код?


package main

import "fmt"

func main() {
    numbers := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 := numbers[:5:8]
    fmt.Println(s1)
    s2 := numbers[::4]
    fmt.Println(s2)

}

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


  • Массив чисел от 0 до 5, затем массив чисел от 0 до 9
  • Массив чисел от 0 до 4, затем массив чисел от 0 до 9
  • Не скомпилируется
  • Массив чисел от 0 до 4, затем пустой массив.

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

Не скомпилируется


3. Допустим у вас следующая иерархия:


src/
    package_1/
        p1_a.go
        p1_b.go
        package_2/
            p2_a.go
            package_3/
                p3_sh.go
                p3_bash.go
                p3_zsh.go

Каждый модуль верхнего уровня импортирует модуль нижнего уровня т.е. package_1 импортирует package_2, а тот в свою очередь package_3. В каждом файле объявлена init-функция след. содержания:


func init () {
    fmt.Println(<название файла, например: p1_a.go>)
}

Что будет выведено на экран?


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


  • Ошибка компиляции: More than one file in package declares init function
  • Порядок не определён
  • p1_a.go
    p1_b.go
    p2_a.go
    p3_a.go
    p3_bash.go
    p3_sh.go
    p3_zsh.go
  • Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)

Правильный ответ
Функции будут вызваны в случайном порядке, но в соответствии с иерархии начиная с нижнего модуля (package_3) и заканчивая верхним (package_1)

4. Чему будут равны константы:


const (
    _ = iota
    Avito
    OLX
    LetGo
    Craiglist = iota 
    eBay
)

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


  • 1,2,3,4,5
  • Ошибка компиляции: incorrect constant declaration: iota used twice
  • 0, 1, 2, 3, 4
  • 1,2,3,0, 4

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

1,2,3,4,5


5. Опытный программист Роб решил добавить модуль для парсинга данных в стандартную библиотеку своего языка. Одним из модулей парсера будет конечный автомат, войдя в поток, Роб набросал следующий код, что произойдёт в момент первой компиляции?


package main

type state func(x int) state

func start(x int) state {
    if x == 0 {
        return middle
    } else {
        return end
    }
}

func middle(_ int) state {
    return end
}

func end(_ int) state {
    return start
}

func main() {
    state := start(0)
    state = state(1)
    state = state(2)
}

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


  • Ошибка в коде: произойдёт ошибка во время компиляции "type 'state' used in self declaration"
  • В stdout ничего не выведется, но процесс завершится успешно
  • Runtime ошибка: возникнет бесконечная рекурсия

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

В stdout ничего не выведется, но процесс завершится успешно.


6. Каким будет результат выполнения кода?


package main

import (
    "fmt"
)

func test() (x int) {
    defer func () {
        x++
    } ()
    x = 1

    return x
}

func main() {
    fmt.Println(test())
}

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


  • 1
  • 2
  • Compile error

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

2


7. Молодой китайский программист Jian Yang решил освоить Go для своего нового гео-стартапа. Начав с обычного Hello World, он решил слегка его модифицировать, дабы освоить конструкцию range… Каким будет результат выполнения кода?


package main

import (
    "fmt"
)

func main() {
    var rc, bc int

    str := "Hello 世界"

    for _ = range str {
        rc++
    }
    for _ = range []byte(str){
        bc++
    }

    fmt.Println(rc, bc)
}

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


  • 8 8
  • 8 12
  • 8 14
  • 8 16

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

8 12




Желаем хорошего дня и ждём ваших ответов в комментариях. Следующий выпуск Avito Quiz планируем сделать по PHP.

Tags:
Hubs:
+31
Comments 19
Comments Comments 19

Articles

Information

Website
avito.tech
Registered
Founded
2007
Employees
5,001–10,000 employees
Location
Россия