> For the complete documentation index, see [llms.txt](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/golang-zadachi/nerassortirovannye-zadachi.md).

# Нерассортированные задачи

\========================

\===   Слайсы, Мапы   ===

\========================

<br>

++++++++++

&#x20;Задача 1

++++++++++

Что выведет код?

<br>

func main() {

v := \[]int{3, 4, 1, 2, 5}

ap(v)

sr(v)

fmt.Println(v)

}

<br>

func ap(arr \[]int) {

arr = append(arr, 10)

}

<br>

func sr(arr \[]int) {

sort.Ints(arr)

}

\ <br>

++++++++++

&#x20;Задача 2

++++++++++

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

\ <br>

var foo \[]int

var bar \[]int

<br>

foo = append(foo, 1)

foo = append(foo, 2)

foo = append(foo, 3)

bar = append(foo, 4)

foo = append(foo, 5)

<br>

fmt.Println(foo, bar)

\ <br>

++++++++++

&#x20;Задача 3

++++++++++

1\. Что выведется?

<br>

package main

import "fmt"

func main() {

&#x20; c := \[]string{"A", "B", "D", "E"}

&#x20; b := c\[1:2]

&#x20; b = append(b, "TT")

&#x20; fmt.Println(c)

&#x20; fmt.Println(b)

}

<br>

++++++++++

&#x20;Задача 4

++++++++++

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

<br>

func main() {

&#x20; var m map\[string]int

&#x20; for \_, word := range \[]string{"hello", "world", "from", "the",

&#x20;   "best", "language", "in", "the", "world"} {

&#x20;   m\[word]++

&#x20; }

&#x20; for k, v := range m {

&#x20;   fmt.Println(k, v)

&#x20; }

}

<br>

++++++++++

&#x20;Задача 5

++++++++++

1\. Что будет в результате выполнения?

<br>

mutate := func(a \[]int) {

&#x20; a\[0] = 0

&#x20; a = append(a, 1)

&#x20; fmt.Println(a)

}

a := \[]int{1, 2, 3, 4}

mutate(a)

fmt.Println(a)

<br>

++++++++++

&#x20;Задача 6

++++++++++

1\. Что выведется?

2\. Зная обо всех таких нюансах, которые могут возникнуть, какие есть рекомендации?

<br>

\# Вариант 1

\-----------

func mod(a \[]int) {

&#x20; for i := range a {

&#x20;   a\[i] = 5

&#x20; }

&#x20; fmt.Println(a)

}

func main() {

&#x20; sl := \[]int{1, 2, 3, 5}

&#x20; mod(sl)

&#x20; fmt.Println(sl)

}

<br>

\# Вариант 2

\-----------

func mod(a \[]int) {

&#x20; for i := range a {

&#x20;   a\[i] = 5

&#x20; }

&#x20; fmt.Println(a)

}

func main() {

&#x20; sl := make(\[]int, 4, 8)

&#x20; sl\[0] = 1

&#x20; sl\[1] = 2

&#x20; sl\[2] = 3

&#x20; sl\[3] = 5

&#x20; mod(sl)

&#x20; fmt.Println(sl)

}

<br>

\# Вариант 3

\-----------

func mod(a \[]int) {

&#x20; a = append(a, 125)

&#x20; for i := range a {

&#x20;   a\[i] = 5

&#x20; }

&#x20; fmt.Println(a)

}

func main() {

&#x20; sl := make(\[]int, 4, 8)

&#x20; sl\[0] = 1

&#x20; sl\[1] = 2

&#x20; sl\[2] = 3

&#x20; sl\[3] = 5

&#x20; mod(sl)

&#x20; fmt.Println(sl)

}

<br>

\# Вариант 4

\-----------

func mod(a \[]int) {

&#x20; a = append(a, 125)

&#x20; for i := range a {

&#x20;   a\[i] = 5

&#x20; }

&#x20; fmt.Println(a)

}

func main() {

&#x20; sl := \[]int{1, 2, 3, 4, 5}

&#x20; mod(sl)

&#x20; fmt.Println(sl)

}

<br>

++++++++++

&#x20;Задача 7

++++++++++

1\. Что будет содержать s после инициализации?

2\. Что произойдет в println для слайса и для мапы?

<br>

func a(s \[]int) {

&#x20;   s = append(s, 37)

}

<br>

func b(m map\[int]int) {

&#x20;   m\[3] = 33

}

<br>

func main() {

&#x20;   s := make(\[]int, 3, 8)

&#x20;   m := make(map\[int]int, 8)

<br>

&#x20;   // add to slice

&#x20;   a(s)

&#x20;   println(s\[3]) //?

<br>

&#x20;   // add to map

&#x20;   b(m)

&#x20;   println(m\[3]) //?

}

<br>

++++++++++

&#x20;Задача 8

++++++++++

1\. Расскажи подробно что происходит

<br>

\# Вариант 1

\-----------

package main

<br>

import "fmt"

<br>

func main() {

&#x20;   a := \[]int{1,2}

&#x20;   a = append(a, 3)

&#x20;   b := append(a, 4)

&#x20;   c := append(a, 5)

<br>

&#x20;   fmt.Println(b)

&#x20;   fmt.Println(c)

}

<br>

\# Вариант 2

\-----------

package main

<br>

import "fmt"

<br>

func main() {

&#x20;   a := \[]int{1,2}

&#x20;   a = append(a, 3)

&#x20;   a = append(a, 7)

&#x20;   b := append(a, 4)

&#x20;   c := append(a, 5)

<br>

&#x20;   fmt.Println(b)

&#x20;   fmt.Println(c)

}

\ <br>

\============================

\====    Многопоточка    ====

\============================

<br>

++++++++++

&#x20;Задача 1

++++++++++

Что выведет код? Исправить все проблемы

<br>

func main() {

ch := make(chan int)

wg := \&sync.WaitGroup{}

wg.Add(3)

for i := 0; i < 3; i++ {

go func(v int) {

defer wg.Done()

ch <- v \* v

}(i)

}

wg.Wait()

var sum int

for v := range ch {

sum += v

}

fmt.Printf("result: %d\n", sum)

}

\ <br>

++++++++++

&#x20;Задача 2

++++++++++

Что выведет код? Должны выводится все значения

<br>

func main() {

a := 5000

for i := 0; i < a; i++ {

go fmt.Println(i)

}

}

\ <br>

++++++++++

&#x20;Задача 3

++++++++++

Будет ошибка что все горутины заблокированы. Какие горутины будут заблокированы? И почему?

<br>

package main

import "fmt"

func main() {

&#x20; ch := make(chan int)

&#x20; ch <- 1

&#x20; go func() {

&#x20;   fmt.Println(<-ch)

&#x20; }()

}

<br>

++++++++++

&#x20;Задача 4

++++++++++

1\. Как это работает, что не так, что поправить?

<br>

func main() {

&#x20; ch := make(chan bool)

&#x20; ch <- true

&#x20; go func() {

&#x20;   <-ch

&#x20; }()

&#x20; ch <-true

}

<br>

++++++++++

&#x20;Задача 5

++++++++++

1\. Как будет работать код?

2\. Как сделать так, чтобы выводился только первый ch?

<br>

func main() {

&#x20;       ch := make(chan bool)

&#x20;       ch2 := make(chan bool)

&#x20;       ch3 := make(chan bool)

&#x20;       go func() {

&#x20;               ch <- true

&#x20;       }()

&#x20;       go func() {

&#x20;               ch2 <- true

&#x20;       }()

&#x20;       go func() {

&#x20;               ch3 <- true

&#x20;       }()

<br>

&#x20;       select {

&#x20;       case <-ch:

&#x20;               fmt.Printf("val from ch")

&#x20;       case <-ch2:

&#x20;               fmt.Printf("val from ch2")

&#x20;       case <-ch3:

&#x20;               fmt.Printf("val from ch3")

&#x20;       }

}

<br>

++++++++++

&#x20;Задача 6

++++++++++

1\. Что выведет код и как исправить?

<br>

var globalMap = map\[string]\[]int{"test": make(\[]int, 0), "test2": make(\[]int, 0), "test3": make(\[]int, 0)}

var a = 0

&#x20;

func main() {

&#x20;   wg := sync.WaitGroup{}

&#x20;   wg.Add(3)

&#x20;   go func() {

&#x20;       wg.Done()

&#x20;       a=10

&#x20;       globalMap\["test"] = append(globalMap\["test"], a)

&#x20;       &#x20;

&#x20;   }()

&#x20;   go func() {

&#x20;       wg.Done()

&#x20;       a=11

&#x20;       globalMap\["test2"] = append(globalMap\["test2"], a)

&#x20;   }()

&#x20;   go func() {

&#x20;       wg.Done()

&#x20;       a=12

&#x20;       globalMap\["test3"] = append(globalMap\["test3"], a)

&#x20;   }()

&#x20;   wg.Wait()

&#x20;   fmt.Printf("%v", globalMap)

&#x20;   fmt.Printf("%d", a)

}

<br>

++++++++++

&#x20;Задача 7

++++++++++

<br>

type Result struct{}

<br>

type SearchFunc func(ctx context.Context, query string) (Result, error)

<br>

func MultiSearch(ctx context.Context, query string, sfs \[]SearchFunc) (Result, error) {

&#x20;   // Нужно реализовать функцию, которая выполняет поиск query во всех переданных SearchFunc

&#x20;   // Когда получаем первый успешный результат - отдаем его сразу. Если все SearchFunc отработали

&#x20;   // с ошибкой - отдаем последнюю полученную ошибку

}

<br>

++++++++++

&#x20;Задача 8

++++++++++

1\. Что выведется и как исправить?

<br>

func main() {

&#x20; var counter int

&#x20; for i := 0; i < 1000; i++ {

&#x20;   go func() {

&#x20;     counter++

&#x20;   }()

&#x20; }

&#x20; fmt.Println(counter)

}

<br>

++++++++++

&#x20;Задача 9

++++++++++

1\. Что выведется и как исправить?

2\. Что поправить, чтобы сохранить порядок?

<br>

func main() {

&#x20; m := make(char string, 3)

&#x20; cnt := 5

&#x20; for i := 0; i < cnt; i++ {

&#x20;   go func() {

&#x20;     m <- fmt.Sprintf("Goroutine %d", i)

&#x20;   }()

&#x20; }

&#x20; for i := 0; i < cnt; i++ {

&#x20;   go ReceiveFromCh(m)

&#x20; }

}

func ReceiveFromCh(ch chan string) {

&#x20; fmt.Println(<-ch)

}

<br>

+++++++++++

&#x20;Задача 10

+++++++++++

1\. Merge n channels

2\. Если один из входных каналов закрывается, то нужно закрыть все остальные каналы

<br>

func case3(channels ...chan int) chan int {

}

<br>

+++++++++++

&#x20;Задача 11

+++++++++++

1\. Описать словами. Предположим есть метод REST API. В нем мы хотим сделать 10 запросов к другим API. Нужно считать данные  и отправить пользователю. Как это сделать? Как добавить таймаут? Стоит ли использовать каналы или можно WaitGroup?

<br>

+++++++++++

&#x20;Задача 12

+++++++++++

1\. Конурентно по батчам запросить данные и записать в файл. Нужна общая конструкция, функции которые делают запрос к сайту и выгрузку в файл можно не реализовывать.&#x20;

2\. Сделать так, чтобы одновременно выполнялось не более chunkSize запросов.&#x20;

<br>

package main

const url = \`<http://jsonplaceholder.typicode.com/tools/%d\\`>

const chunkSize = 100

const dataCount = 2 << 10

<br>

+++++++++++

&#x20;Задача 13

+++++++++++

1\. Запросить параллельно данные из источников. Если все где-то произошла ошибка, то вернуть ошибку, иначе вернуть nil.

2\. Представим, что теперь функция должна возвращать результат int. Есть функция resp.Size(), для каждого url надо проссумировать и вернуть, если ошибок не было. Просто описать подход к решению

3\. Что делать, если урлов у нас миллионы?

<br>

package main

<br>

func main() {

&#x20;   \_, err := download(\[]string{

&#x20;       "<https://example.com/e25e26d3-6aa3-4d79-9ab4-fc9b71103a8c.xml>",

&#x20;       "<https://example.com/a601590e-31c1-424a-8ccc-decf5b35c0f6.xml>",

&#x20;       "<https://example.com/1cf0dd69-a3e5-4682-84e3-dfe22ca771f4.xml>",

&#x20;       "<https://example.com/ceb566f2-a234-4cb8-9466-4a26f1363aa8.xml>",

&#x20;       "<https://example.com/b6ed16d7-cb3d-4cba-b81a-01a789d3a914.xml>",

&#x20;   })

<br>

&#x20;   if err != nil {

&#x20;       panic(err)

&#x20;   }

}

<br>

func download(urls \[]string) (error) {

&#x20;   return nil

}

\ <br>

+++++++++++

&#x20;Задача 14

+++++++++++

1\. Что выведет на экран и сколько времени будет работать?

2\. Нужно ускорить, чтобы работало быстрее. Сколько будет работать теперь?

3\. Если бы в networkRequest выполнялся реальный сетевой вызов, то какие с какими проблемами мы могли бы столкнуться в данном коде?

4\. Если url немного, а запросов к ним много, то как можно оптимизировать?

<br>

package main

<br>

import (

&#x20;   "fmt"

&#x20;   "time"

)

<br>

const numRequests = 10000

<br>

var count int

<br>

var m sync.Mutex

<br>

func networkRequest() {

&#x20;   time.Sleep(time.Millisecond) // Эмуляция сетевого запроса.

&#x20;   m.Lock()

&#x20;   count++

&#x20;   m.Unlock()

}

<br>

func main() {

&#x20;   var wg sync.WaitGroup

<br>

&#x20;   wg.Add(numRequests)

&#x20;   for i := 0; i < numRequests; i++ {

&#x20;       go func() {

&#x20;           defer wg.Done()

&#x20;           networkRequest()

&#x20;       }()

&#x20;   }

<br>

&#x20;   wg.Wait()

&#x20;   fmt.Println(count)

}

<br>

+++++++++++

&#x20;Задача 15

+++++++++++

<br>

// Есть функция unpredictableFunc, работающая неопределенно долго и возвращающая число.

// Её тело нельзя изменять (представим, что внутри сетевой запрос).

<br>

// Нужно написать обертку predictableFunc,&#x20;

// которая будет работать с заданным фиксированным таймаутом (например, 1 секунду).

<br>

package main

<br>

import (

&#x20;   "fmt"

&#x20;   "math/rand"

&#x20;   "time"

)

<br>

func init() {

&#x20;   rand.Seed(time.Now().UnixNano())

}

<br>

// Есть функция, работающая неопределенно долго и возвращающая число.

// Её тело нельзя изменять (представим, что внутри сетевой запрос).

func unpredictableFunc() int64 {

&#x20;   rnd := rand.Int63n(5000)

&#x20;   time.Sleep(time.Duration(rnd) \* time.Millisecond)

<br>

&#x20;   return rnd

}

<br>

// Нужно изменить функцию обертку, которая будет работать с заданным таймаутом (например, 1 секунду).

// Если "длинная" функция отработала за это время - отлично, возвращаем результат.

// Если нет - возвращаем ошибку. Результат работы в этом случае нам не важен.

//

// Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог).

// Сигнатуру функцию обёртки менять можно.

func predictableFunc() int64 {

}

<br>

func main() {

&#x20;   fmt.Println("started")

<br>

&#x20;   fmt.Println(predictableFunc())

}

<br>

+++++++++++

&#x20;Задача 16

+++++++++++

<br>

// Написать код функции, которая делает merge N каналов. Весь входной поток перенаправляется в один канал.

<br>

func merge(cs ...<-chan int) <-chan int {

}

<br>

+++++++++++

&#x20;Задача 17

+++++++++++

1\. Что выведется? Исправь проблему

<br>

\# Вариант1

\----------

x := make(map\[int]int, 1)

go func() { x\[1] = 2 }()

go func() { x\[1] = 7 }()

go func() { x\[1] = 10 }()

time.Sleep(100 \* time.Millisecond)

fmt.Println("x\[1] =", x\[1])

<br>

+++++++++++

&#x20;Задача 18

+++++++++++

1\. Иногда приходят нули. В чем проблема? Исправь ее

2\. Если функция bank\_network\_call выполняется 5 секунд, то за сколько выполнится balance()? Как исправить проблему?

3\. Представим, что bank\_network\_call возвращает ошибку дополнительно. Если хотя бы один вызов завершился с ошибкой, то balance должен вернуть ошибку.

<br>

func balance() int {

&#x20;   x := make(map\[int]int, 1)

&#x20;   var m sync.Mutex

&#x20;

&#x20;   // call bank

&#x20;   for i := 0; i < 5; i++ {

&#x20;       i := i

&#x20;       go func() {

&#x20;   m.Lock()

&#x20;           b := bank\_network\_call(i)

&#x20;      &#x20;

&#x20;           x\[i] = b

&#x20;           m.Unlock()

&#x20;       }()

&#x20;   }

<br>

&#x20;   // Как-то считается сумма значений в мапе и возвращается

&#x20;   return sumOfMap

}

\
\ <br>

\==========================

\====    Интерфейсы    ====

\==========================

<br>

++++++++++

&#x20;Задача 1

++++++++++

Что выведет код?

<br>

type impl struct{}

<br>

type I interface {

C()

}

<br>

func (\*impl) C() {}

<br>

func A() I {

return nil

<br>

}

func B() I {

var ret \*impl

return ret

}

<br>

func main() {

a := A()

b := B()

fmt.Println(a == b)

}

<br>

++++++++++

&#x20;Задача 2

++++++++++

1\. Добавить код, который выведет тип переменной whoami

<br>

func printType(whoami interface{}) {

}

<br>

func main() {

&#x20; printType(42)

&#x20; printType("im string")

&#x20; printType(true)

}

<br>

++++++++++

&#x20;Задача 3

++++++++++

Исправить функцию, чтобы она работала. Сигнатуру менять нельзя

<br>

func printNumber(ptrToNumber interface{}) {

&#x20;       if ptrToNumber != nil {

&#x20;               fmt.Println(\*ptrToNumber.(\*int))

&#x20;       } else {

&#x20;               fmt.Println("nil")

&#x20;       }

}

<br>

func main() {

&#x20;       v := 10

&#x20;       printNumber(\&v)

&#x20;       var pv \*int

&#x20;       printNumber(pv)

&#x20;       pv = \&v

&#x20;       printNumber(pv)

}

<br>

\==========================

\====    Разные темы   ====

\==========================

<br>

++++++++++

&#x20;Задача 1

++++++++++

1\. Что выведется?

<br>

package main

<br>

import (

&#x20; "fmt"

&#x20; "math"

)

<br>

func main() {

&#x20; x := 2.0

&#x20; y := 3.0

<br>

&#x20; result := math.Pow(x, y)

<br>

&#x20; fmt.Println("%f ^ %f = %f\n", x, y, result)

}

<br>

++++++++++

&#x20;Задача 2

++++++++++

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

<br>

func main() {

&#x20; fmt.Println("start")

&#x20; for i := 1; i < 4; i++ {

&#x20;   defer fmt.Println(i)

&#x20; }

&#x20; fmt.Println("end")

}

<br>

++++++++++

&#x20;Задача 3

++++++++++

1\. Что будет в результате выполнения теста?

<br>

type User struct {

&#x20; Valid bool

&#x20; Id int64

&#x20; Number int32

}

type CUser struct {

&#x20; Id int64

&#x20; Number int32

&#x20; Valid bool

}

func TestSize(t \*testing.T) {

&#x20; user := User{}

&#x20; cuser := CUser{}

&#x20; if unsafe.Sizeof(user) == unsafe.Sizeof(cuser) {

&#x20;   t.Log("structs size are equal")

&#x20; }

}

<br>

++++++++++

&#x20;Задача 4

++++++++++

1\. Какие строки работают нормально, а какие нет и почему?

<br>

package main

<br>

type T \[]int

func (T) X(){}

func (\*T) Z(){}

<br>

func main() {

&#x20;   var t T

&#x20;   t.X() // 1

&#x20;   t.Z() // 2

&#x20;   var p = \&t

&#x20;   p.X() // 3

&#x20;   p.Z() // 4

&#x20;   T{}.X() // 5

&#x20;   T{}.Z() // 6

}

<br>

++++++++++

&#x20;Задача 5

++++++++++

1\. Расскажи подробно что происходит

2\. Как сделать так, чтобы работало?

<br>

package main

<br>

import "fmt"

<br>

func main() {

&#x20;   str := "Привет"

&#x20;   str\[2] = 'e'

&#x20;   fmt.Println(str)

}

\ <br>

\==========================

\====    Кастомные     ====

\==========================

<br>

++++++++++

&#x20;Задача 1

++++++++++

1\. Написать функцию, которая принимает число N и возвращает слайс размера N с уникальными числами.

2\. Идеи как тестировать функцию?

\ <br>

++++++++++

&#x20;Задача 2

++++++++++

1\. Нужно написать функцию генератор паролей, которая принимает целое число n, а на выходе строка длины n из букв a-zA-Z и 0-9

2\. Что тут можно улучшить?

3\. Какие тесты ты бы написал для нее? Есть какая-нибудь возможность угадать, какая строка будет генерироваться, чтобы писать тесты?

<br>

++++++++++

&#x20;Задача 3

++++++++++

Написать функцию, которая устанавливает i-ый бит числа в 0

\ <br>

++++++++++

&#x20;Задача 4

++++++++++

<br>

package main

&#x20;

type Data struct {

&#x20;   ID int

&#x20;   Payload map\[string]interface{}

}

&#x20;

type Reader interface{

&#x20;   Read() \[]\*Data

}

&#x20;

type Processor interface{

&#x20;   Process(Data) (\[]\*Data, error)

}

&#x20;

type Writer interface{

&#x20;   Write(\[]\*Data)

}

&#x20;

type Manager interface{

&#x20;   Manage() // blocking

}

&#x20;

// Необходимо имплементировать интерфейс Manager так, чтобы Manager мог принимать данные из одного Reader

// обрабатывать полученные данные на каждом из списка Processor и результирующие данные передавать в Writer.

// При возникновении ошибки при обработке, прочитанные из Reader данные необходимо пропустить.

<br>

++++++++++

&#x20;Задача 5

++++++++++

1\. Релизовать ручку так, чтобы она выполнялась быстрее чем за одну секунду

2\. Теперь допустим, что запрашивается температура в каком-то location\_id. Опиши, как это реализовать.&#x20;

<br>

// Есть функция getWeather, которая через нейронную сеть вычисляет температуру за \~1 секунду

// Есть highload ручка /weather/highload с нагрузкой 3k RPS

// Необходимо реализовать код этой ручки

<br>

func getWeather() int {

&#x20;   time.Sleep(1 \* time.Second)

&#x20;   return rand.Intn(70) - 30

}

<br>

func main() {

&#x20;   http.HandleFunc("/weather/highload", func(resp http.ResponseWriter, req \*http.Request) {

\ <br>

&#x20;   })

}

<br>

++++++++++

&#x20;Задача 6

++++++++++

1\. Реализовать кеш. Для простоты считаем, что у нас бесконечная память и нам не нужно задумываться об удалении ключей из него.

1\. Почему использовал RWMutex, а не Mutex?

2\. Теперь представим что память не бесконечная. С какими проблемами столкнемся и как их решить?

1\. Какие есть алгоритмы выселения?

3\. Реализуй LRU

<br>

// In-memory cache

// Нужно написать простую библиотеку in-memory cache.

// Реализация должна удовлетворять интерфейсу:

<br>

type Cache interface {

&#x20;   Set(k, v string)

&#x20;   Get(k string) (v string, ok bool)

}

\ <br>

\=====================

\====    Ревью    ====

\=====================

<br>

++++++++++

&#x20;Задача 1

++++++++++

Ревью кода (github.com/nosuchpersonn/interview\_project)

\ <br>

++++++++++

&#x20;Задача 2

++++++++++

Ревью кода (github.com/nosuchpersonn/some\_app)

\ <br>

++++++++++

&#x20;Задача 3

++++++++++

Ревью кода (github.com/nosuchpersonn/some\_app\_2)

<br>
