Golang вопросы собеседований
13.5K subscribers
631 photos
3 videos
1 file
433 links
@notxxx1 - админ

@Golang_google - Golang для разработчиков

@itchannels_telegram - 🔥лучшие из ит

@golangl - chat

@golangtests - golang tests

@golang_jobsgo - go chat jobs

@ai_machinelearning_big_data - AI

@data_analysis_ml

РКН: clck.ru/3FmtKd
加入频道
👣 Вопрос с собеседования: зачем нужны интерфейсы в Go?

Интерфейсы в Go — это способ реализации полиморфизма

Проиллюстрировать интерфейсы можно так:
package main

import (
"math"
"fmt"
)

// Круг.
type Circle struct {
x, y, r float64
}

// Прямоугольник.
type Rectangle struct {
x1, y1, x2, y2 float64
}

// Интерфейс фигуры, которому удовлетворяют все типы, имеющие соответствующий
// метод вычисления площади Area().
type Figure interface {
Area() float64
}

// Реализация интерфейса Figure для Circle.
func (c *Circle) Area() float64 {
return math.Pi * c.r * c.r
}

// Реализация интерфейса Figure для Rectangular.
func (r *Rectangle) Area() float64 {
return math.Abs(r.x2 - r.x1) * math.Abs(r.y2 - r.y1)
}

func main() {
figures := make([]Figure, 0) // Срез фигур.

// Мы можем добавлять в этот срез все, что удовлетворяет интерфейсу
// Figure, несмотря на то, что это элементы разных типов:
figures = append(figures, &Circle{0, 0, 10})
figures = append(figures, &Rectangle{0, 0, 10, 20})

// И теперь мы можем единообразно обрабатывать эти данные разных типов.
for _, figure := range figures {
fmt.Printf("Area of %#v = %f\n", figure, figure.Area())
}
}


Результат:
$ go run figures.go
Area of &main.Circle{x:0, y:0, r:10} = 314.159265
Area of &main.Rectangle{x1:0, y1:0, x2:10, y2:20} = 200.000000


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Указатели на структуры

▶️Итак, вот код:
v1 := Struct{}
v2 := &Struct{}

В чём отличие? Понятно, что во втором случае передается указатель, но когда что нужно использовать?


▶️Первая строка создает новый экземпляр структуры Struct и присваивает его переменной v1. В этом случае переменная v1 будет содержать саму структуру, а не указатель на нее.

Вторая строка создает новый экземпляр структуры Struct с помощью оператора &, который возвращает указатель на структуру, и присваивает этот указатель переменной v2. В этом случае переменная v2 будет содержать указатель на структуру, а не саму структуру.

Принципиальное отличие между этими двумя строками состоит в том, что в первом случае мы работаем с самой структурой, а во втором случае мы работаем с указателем на структуру. Это важно, потому что при работе с указателями мы можем изменять значения полей структуры, даже если у нас есть только указатель на нее. Если мы работаем со структурой напрямую, без использования указателя, то изменение полей структуры невозможно.

Вот, для наглядности:
type Struct struct {
Value int
}

func main() {
v1 := Struct{} // Создаем структуру
v1.Value = 10 // Изменяем поле Value

v2 := &Struct{} // Создаем указатель на структуру
v2.Value = 20 // Изменяем поле Value через указатель

fmt.Println(v1.Value) // Выводит 10
fmt.Println(v2.Value) // Выводит 20
}


В этом примере мы создаем структуру Struct и изменяем поле Value сначала через саму структуру, а затем через указатель на структуру. Оба вывода будут отличаться, потому что изменения сделанные через указатель на структуру будут отражаться на самой структуре, в то время как изменения, сделанные через саму структуру, не влияют на указатель на нее.

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Особенности работы defer

Почему в данной ситуации сначала выводится "Second" и "Third" (хотя они должны идти после "First"), а "Fourth" как раз лишь только после "First"?
Ведь defer должен срабатывать перед закрытием функции, в которой он объявлен.
package main

import "fmt"

func main() {
defer fmt.Println(changePointer())
fmt.Println("First")
}

func changePointer() string {
defer fmt.Println("Third")
fmt.Println("Second")
return "Fourth"
}



Итак, не будем тянуть, сразу к сути.
changePointer() вызывается, потому что это необходимо для получения результата, который может быть использован в fmt.Println(changePointer()).
Функция changePointer выполняется, чтобы получить результат, который возвращается в main, и только после этого запланированные defer — вызовы выполняются.
Вот такие дела

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Простая задача в Go

Итак, суть задания: пользователь вводит произвольную строку в консоль. Считываем это через fmt.Scanln(), тут все понятно.
Далее необходимо вывести True, если строка состоит из цифр и False во всех остальных случаях. Как это можно сделать?


Как вариант проверить строку регуляркой: ^\d*$ или, что аналогично: ^[0-9]*$.
test:="1233455677789900066554436433"
pattern:=`^\d*$`

matched,err:= regexp.Match(pattern,
[]byte(test))

Ну и неплохо бы ещё прикрутить обработку ошибок

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Разработка микросервисов на Go

Согласно Statista, больше 80% организаций со штатом от 5000 сотрудников используют микросервисную архитектуру, или микросервисы. Разработка микросервисов помогает бизнесу масштабироваться, делают приложения надежнее и упрощают кодовую базу. Но подходят они не всем.

Держите полезную статью о том, что такое микросервисы, в чем их преимущества и когда для бизнеса есть смысл на них переходить.

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Определение языка в строке

Итак, реальный кейс: необходимо выяснить язык в строке. Если в ней содержатся кириллические символы, значит она написана на русском языке. Если кириллических символов нет - значит на английском.
Вот первая идея, которая приходит в голову; тут используются регулярные выражения:
import (
"regexp"
)

func main() {
str := "Некая строка c кириллическими символами"
re := regexp.MustCompile("[А-Яа-я]+?") //проверяем на киррилические символы
isRussian := re.MatchString(str)

if isRussian {
...
}
}

Есть ли более эффективный способ узнать, на каком языке написана строка? Языков только два - русский и английский.


Самый быстрый (и он же, самый простой) способ:
func IsEngByLoop(str string) bool {
for i := 0; i < len(str); i++ {
if str[i] > unicode.MaxASCII {
return false
}
}
return true
}

Раз мы уверены, что имеем дело только с 2 языками, то достаточно определить, являются ли все символы строки ASCII символами. Если да, то строка написана на Английском, если нет - то на каком-то другом (в вашем случае, это Русский).
Вот и все дела

📎 Подробнее

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Почему это не вызывает ошибку?

package main
import "fmt"

func main() {
slice := []int{1}
fmt.Println(slice[1:])

}

Мы ведь обращаемся к элементу слайса с индексом 1, которого нет


▶️Итак, лучше 1 раз увидеть (определение поведения слайсов от авторов), чем 100 раз услышать (читать чьи-то интерпретации)

Вот цитата:
"For arrays or strings, the indices are in range if 0 <= low <= high <= len(a), otherwise they are out of range. For slices, the upper index bound is the slice capacity cap(a) rather than the length."
Особенно важно последнее предложение

Ну и небольшой пример для полного понимания:

package main
import "fmt"

func main() {

slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
slice1 := slice[5:6]
slice2 := slice1[1:10]
fmt.Println(slice1, slice2, cap(slice2), len(slice2))

}


Подробнее

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как организовать структуру проекта с несколькими модулями Golang?

▶️Итак, в 1 проекте должны содержаться 3 различные программы: Repeater, Controller и Executor.
Также нужно сделать 1 модуль, который они будут импортировать с некоторым набором общих для них функций.
Как организовать структуру такого проекта?


▶️Всё просто, делаем 3 разных файла main.go под каждый сервис. Кладём их каждый в свою подпапку в директории, например cmd.
А для общих библиотек используем отдельную директорию, например pkg, и будем импортировать отсюда функционал во все 3 сервиса.

Т.е. у нас получается структура файлов:
cmd/
repeater/
main.go
controller/
main.go
executor/
main.go
pkg/
c-library/
clibrary.go
go.mod


И потом запускаем компиляцию:
go build ./cmd/repeater
go build ./cmd/controller
go build ./cmd/executor


Пример main.go:
package main

import c_library "test/pkg/c-library"

func main() {
c_library.HelloWorld()
}


И общая библиотека:
package c_library

import "fmt"

func HelloWorld() {
fmt.Println("HELLO WORLD")
}


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Здоровая конкуренция в Go. Главное не перехитрить самого себя

Вот неплохая статья, которая обсуждает параллельные вычисления на одном процессоре и масштабирование с ограничением количества одновременных запросов.
Рекомендуется использовать первый паттерн для выполнения параллельных вычислений без ограничений с использованием errgroup.

Если возможен бесконтрольный рост удаленных запросов, следует ограничить одновременное выполнение и подобрать лимит опытным путем.
Ну и для ускорения сложных вычислений можно использовать runtime.NumCPU в качестве лимита для распараллеливания на все ядра процессора.

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Учимся разрабатывать REST API на Go на примере сокращателя ссылок

Держите годный контент
В этой статье описывается создание полноценного REST API сервиса — URL Shortener — и его деплой на виртуальный сервер с помощью GitHub Actions.

Это будет не игрушечный проект, а полностью готовый к использованию:
— для него будет выбран актуальный http-роутер
— важное место отведено о логам
— будут написаны тесты: unit-тесты, тесты хэндлеров и функциональные
— будет настроен автоматический деплой через GitHub Actions и др.

📎 Статья

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ 4 Репозитория на Github для подготовки к 4 различным типам собеседований по разработке программного обеспечения:

1. Собеседования по системному дизайну: https://github.com/ashishps1/awesome-system-design-resources

2. Собеседования по низкоуровневому проектированию: https://github.com/ashishps1/awesome-low-level-design

3. Собеседования по программированию: https://github.com/ashishps1/awesome-leetcode-resources

4. Поведенческое собеседование: https://github.com/ashishps1/awesome-behavioral-interviews

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Отличный обучающий материал по Go

Держите полезный ресурс, здесь показана большая часть того, что понадобится в реальной работе с Go: структуры, интерфейсы, создание своего веб-сервера, межсайтовый скриптинг, работа с БД и много всего ещё.
Очень полезно, рекомендую

📎 Ссылка

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Golang
👣 Шпаргалка по Go

Мощная шпаргалка по Go, которая покрывает практически все темы
Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер)

Что внутри?
├╼ Компилятор
├╼ Пакеты
├╼ Функции
├╼ Управление памятью
├╼ Операторы
├╼ Управляющие структуры
├╼ Объектноориентированность
├╼ Интерфейсы
├╼ Обработка ошибок
├╼ Горутины (Goroutine)
├╼ Проверка управления памятью
├╼ Reflect
├╼ Добавление кода C
├╼ GUI
╰╼ Распределенные системы

📎 Cheatsheet

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM