- Дана структура Human (с произвольным набором полей и методов). Реализовать встраивание методов в структуре Action от родительской структуры Human (аналог наследования).
- Написать программу, которая конкурентно рассчитает значение квадратов чисел взятых из массива (2,4,6,8,10) и выведет их квадраты в stdout.
- Дана последовательность чисел: 2,4,6,8,10. Найти сумму их квадратов(22+32+42….) с использованием конкурентных вычислений.
- Реализовать постоянную запись данных в канал (главный поток). Реализовать набор из N воркеров, которые читают произвольные данные из канала и выводят в stdout. Необходима возможность выбора количества воркеров при старте.
Программа должна завершаться по нажатию Ctrl+C. Выбрать и обосновать способ завершения работы всех воркеров. - Разработать программу, которая будет последовательно отправлять значения в канал, а с другой стороны канала — читать. По истечению N секунд программа должна завершаться.
- Реализовать все возможные способы остановки выполнения горутины.
- Реализовать конкурентную запись данных в map.
- Дана переменная int64. Разработать программу которая устанавливает i-й бит в 1 или 0.
- Разработать конвейер чисел. Даны два канала: в первый пишутся числа (x) из массива, во второй — результат операции x*2, после чего данные из второго канала должны выводиться в stdout.
- Дана последовательность температурных колебаний: -25.4, -27.0 13.0, 19.0, 15.5, 24.5, -21.0, 32.5. Объединить данные значения в группы с шагом в 10 градусов. Последовательность в подмножноствах не важна.
Пример: -20:{-25.0, -27.0, -21.0}, 10:{13.0, 19.0, 15.5}, 20: {24.5}, etc. - Реализовать пересечение двух неупорядоченных множеств.
- Имеется последовательность строк - (cat, cat, dog, cat, tree) создать для нее собственное множество.
- Поменять местами два числа без создания временной переменной.
- Разработать программу, которая в рантайме способна определить тип переменной: int, string, bool, channel из переменной типа interface{}.
- К каким негативным последствиям может привести данный фрагмент кода, и как это исправить? Приведите корректный пример реализации.
- К каким негативным последствРеализовать быструю сортировку массива (quicksort) встроенными методами языка.
- Реализовать бинарный поиск встроенными методами языка.
- Реализовать структуру-счетчик, которая будет инкрементироваться в конкурентной среде. По завершению программа должна выводить итоговое значение счетчика.
- Разработать программу, которая переворачивает подаваемую на ход строку (например: «главрыба — абырвалг»). Символы могут быть unicode.
- Разработать программу, которая переворачивает слова в строке. Пример: «snow dog sun — sun dog snow».
- Реализовать паттерн «адаптер» на любом примере.
- Разработать программу, которая перемножает, делит, складывает, вычитает две числовых переменных a,b, значение которых > 2^20.
- Удалить i-ый элемент из слайса.
- Разработать программу нахождения расстояния между двумя точками, которые представлены в виде структуры Point с инкапсулированными параметрами x,y и конструктором.
- Реализовать собственную функцию sleep.
- Разработать программу, которая проверяет, что все символы в строке уникальные (true — если уникальные, false etc). Функция проверки должна быть регистронезависимой. иям может привести данный фрагмент кода, и как это исправить? Приведите корректный пример реализации.
- Какой самый эффективный способ конкатенации строк
s := strings.Builder{}
s.WriteString("hello ")
s.WriteString("world")
fmt.Println(s.String())
- Что такое интерфейсы, как они применяются в Go?
Интерфейсы это инструменты для определения наборов действий и поведения. Они позволяют объектам опираться на абстракции, а не фактические реализации других объектов. При этом для компоновки различных поведений можно группировать несколько интерфейсов.
- Чем отличаются RWMutex от Mutex?
RWMutex применяется со структурами, безопасными для параллельного чтения, но небезопасными для записи. RWMutex позволяет не блокировать чтение, если в данный момент не идёт запись.
- Чем отличаются буферизированные и не буферизированные каналы?
При отправке сообщения в небуферизированный канал поток блокируется и ждёт, когда кто-то извлечёт сообщение. В буферизированном канале поток блокируется когда буфер заполнен полностью
- Какой размер у структуры struct{}{}?
s := struct{}{}
fmt.Printf("%v\n", unsafe.Sizeof(s))
0
- Есть ли в Go перегрузка методов или операторов?
В Go нет перегрузки методов и функций. Предлагается просто давать разные имена методам и функциям.
- В какой последовательности будут выведены элементы map[int]int?
Пример:
m[0]=1
m[1]=124
m[2]=281
Рандомно
- В чем разница make и new?
make
используется для созданияslice, map, chan
,new
- для всегоmake
возвращает сам объект,new
выделяет память и возвращает указатель на созданный объект
- Сколько существует способов задать переменную типа slice или map?
var first []string
second := []string{}
fourth := make([]string, 0)
third := new([]string)
var first map[int]int
second := map[string]int{}
fourth := make(map[string]int)
third := new(map[string]int)
- Что выведет данная программа и почему?
func update(p *int) {
b := 2
p = &b
}
func main() {
var (
a = 1
p = &a
)
fmt.Println(*p)
update(p)
fmt.Println(*p)
}
1 1
Вupdate()
меняется не значение по указателю, а значение самого указателя, которое остаётся в локальной видимости
- Что выведет данная программа и почему?
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 5; i++ {
wg.Add(1)
go func(wg sync.WaitGroup, i int) {
fmt.Println(i)
wg.Done()
}(wg, i)
}
wg.Wait()
fmt.Println("exit")
}
0..4 в рандомном порядке, далее deadlock, т.к. в горутину передан
WaitGroup
, а не указатель на него
- Что выведет данная программа и почему?
func main() {
n := 0
if true {
n := 1
n++
}
fmt.Println(n)
}
0
В блоке if создается локальная переменная
- Что выведет данная программа и почему?
func someAction(v []int8, b int8) {
v[0] = 100
v = append(v, b)
}
func main() {
var a = []int8{1, 2, 3, 4, 5}
someAction(a, 6)
fmt.Println(a)
}
[100 2 3 4 5]
При append создается новый slice, не затронут оригинальный slice
- Что выведет данная программа и почему?
func main() {
slice := []string{"a", "a"}
func(slice []string) {
slice = append(slice, "a")
slice[0] = "b"
slice[1] = "b"
fmt.Print(slice)
}(slice)
fmt.Print(slice)
}
[b b a][a a]
slice в анонимной функции перекрывает slice в main, обновляется и выводится [b b a], slice в main не изменялся - выводится [a a]