Avito / Авито (платформа)
Вопросы: стандартные вопросы про горутины, каналы, пакет sync и рантайм Go.
Задача: Что выведет и почему? go/puzzles
Заголовок раздела «Задача: Что выведет и почему? go/puzzles»type Person struct { Name string}
func changeName(person *Person) { person = &Person{ Name: "Alice ", }}
func main() { person := &Person{ Name: "Bob ", }
fmt.Println(person.Name) changeName(person) fmt.Println(person.Name)}Доп. вопрос: что нужно изменить в функции, чтобы выводилось «Alice»
Заголовок раздела «Доп. вопрос: что нужно изменить в функции, чтобы выводилось «Alice»»Задача: За какое время отработает программа? go/basics
Заголовок раздела «Задача: За какое время отработает программа? go/basics»const numRequests = 10000
var count int
func networkRequest() { time.Sleep(time.Millisecond) // Эмуляция сетевого запроса count++}
func main() { for i := 0; i < numRequests; i++ { networkRequest() }
fmt.Println(count)}Доп. задача: изменить код так, чтобы запросы выполнялись в многопоточном режиме за минимальное время.
Доп. вопросы
Заголовок раздела «Доп. вопросы»- для чего тут нужна вейтгруппа?
go/sync - за какое время выполнятся все запросы при GOMAXPROCS=1?
go/runtime - как при этом будет работать P с горутинами в этой задаче?
go/concurrency - что такое netpoller?
go/runtime - почему необходимо использовать мьютекс? А еще можно решить эту проблему?
go/sync
// Есть функция, работающая неопределенно долго и возвращающая число.// Еe тело нельзя изменять (представим, что внутри сетевой запрос).func unpredictableFunc() int64 { rnd := rand.Int63n(5000) time.Sleep(time.Duration(rnd) * time.Millisecond)
return rnd}
// Нужно изменить функцию обертку, которая будет работать с заданным таймаутом (например, 1 секунду).// Если "длинная "функция отработала за это время - отлично, возвращаем результат.// Если нет - возвращаем ошибку. Результат работы в этом случае нам не важен.//// Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог).// Сигнатуру функцию обертки менять можно.func predictableFunc() int64 { return unpredictableFunc()}
func main() { fmt.Println(predictableFunc())}