Библиотека Go для собеса | вопросы с собеседований
Вопросы с собеседований по Go и ответы на них. Список наших каналов: https://t.me/proglibrary/8353 Учиться у нас: https://proglib.io/w/907158ab Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
إظهار المزيد- المشتركون
- التغطية البريدية
- ER - نسبة المشاركة
جاري تحميل البيانات...
جاري تحميل البيانات...
sync
или сторонних библиотек вроде go-cache
:
package main
import (
"fmt"
"sync"
)
func main() {
// создаем новый кэш
cache := &sync.Map{}
// добавляем пару ключ-значение в кэш
cache.Store("key", "value")
// извлекаем значение из кэша
value, ok := cache.Load("key")
if ok {
fmt.Println(value) // Output: value
}
// удаляем ключ из кэша
cache.Delete("key")
// проверяем, существует ли ключ в кэше
_, ok = cache.Load("key")
fmt.Println(ok) // Output: false
}
В примере мы создаем новую структуру sync.Map
и используем функции Store()
, Load()
, Delete()
для добавления, извлечения и удаления пар ключ-значение из кэша соответственно.
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
В этом примере к полям структуры User
добавлены теги json
, которые указывают, как эти поля должны быть сериализованы в JSON. Тег json:"name"
говорит, что поле Name
должно быть представлено как "name"
в JSON, аналогично для поля Age
.
Для работы с этими тегами можно использовать пакет reflect
. Например, чтобы получить значение тега json
для поля Name
, можно использовать:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := User{Name: "John Doe", Age: 30}
t := reflect.TypeOf(p)
field, ok := t.FieldByName("Name")
if ok {
fmt.Println(field.Tag.Get("json")) // Выведет: name
}
}
httputil
:
package main
import (
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})
http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}
В примере входящие запросы на обратный прокси на порту 8000 будут перенаправлены на целевой сервер example.com
.
Мы также можем настроить поведение обратного прокси, реализовав функцию Director
, которая может быть использована для изменения запроса перед его перенаправлением на целевой сервер.
📌 Пример настройки функции Director:
package main
import (
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})
proxy.Director = func(req *http.Request) {
req.Header.Set("X-Forwarded-Host", req.Host)
req.Header.Set("X-Origin-Host", targetServer)
req.Host = targetServer
}
http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}
🤔 Кодер или программист? Мы подготовили материал, чем отличается программист от кодера. Объясняем простым языком: их можно сравнить с архитектором и строителем. Например, архитектор разговаривает с заказчиком, проектирует здание, следит за исполнением. А строитель возводит пол, стены, крышу. Эта аналогия хорошо показывает отличия программиста и кодера. Кодер с программистом имеют разные уровни ответственности, на карточках вы узнаете подробнее о каждом. #база
rate
из стандартной библиотеки.
Один из распространенных подходов к ограничению скорости — использование алгоритма token bucket, который позволяет добавлять фиксированное количество токенов в пакет с фиксированной скоростью. Когда токен извлекается из бакета, скорость добавления токенов временно уменьшается.
Пакет rate
предоставляет функцию NewLimiter()
, которую можно использовать для создания нового token bucket rate limiter. Например:
limiter := rate.NewLimiter(rate.Limit(100), 100)
Затем можно использовать метод limiter.Allow()
, чтобы проверить, доступен ли токен перед выполнением задачи:
if limiter.Allow() {
// выполнение задачи
} else {
// превышен лимит скорости
}
В качестве альтернативы можно использовать метод limiter.Wait()
, чтобы подождать, пока токен станет доступен:
limiter.Wait()
// выполнение задачи
Также можно использовать метод limiter.Reserve()
, чтобы зарезервировать токен заранее и выполнить задачу позже.تسمح خطتك الحالية بتحليلات لما لا يزيد عن 5 قنوات. للحصول على المزيد، يُرجى اختيار خطة مختلفة.