🤔 Какие основные отличия между слайсами и массивами в Go?
Anonymous Quiz
94%
Массивы имеют фиксированный размер, а слайсы могут изменять размер
3%
Слайсы могут содержать элементы разных типов, а массивы - только одного типа
1%
Массивы могут быть переданы по ссылке, а слайсы - только по значению
2%
Слайсы хранятся в памяти на стеке, а массивы - в куче
Весь код находится в одном проекте, что упрощает понимание, разработку и отладку. Разработчики могут легко работать с общей кодовой базой.
Приложение разворачивается как единое целое, что упрощает процесс развертывания. Нет необходимости координировать развертывание множества сервисов.
Взаимодействие между компонентами происходит внутри одного процесса, что устраняет сетевые задержки и обеспечивает более быструю работу.
Все компоненты приложения имеют доступ к одной базе данных, что упрощает управление транзакциями и консистентностью данных.
Поскольку приложение развертывается как единое целое, инфраструктурные расходы на управление сетью, оркестрацию и мониторинг меньше по сравнению с микросервисной архитектурой.
Масштабировать приложение приходится целиком, что может быть неэффективно. Если только одна часть приложения испытывает высокую нагрузку, всю систему нужно масштабировать, что приводит к избыточным затратам.
По мере роста приложения кодовая база становится более сложной, что затрудняет поддержку и внесение изменений. Даже небольшие изменения могут потребовать повторного тестирования и развертывания всего приложения.
Все компоненты должны использовать одну и ту же технологическую платформу, что ограничивает возможность выбора лучших инструментов и фреймворков для разных частей приложения.
Развертывание монолитного приложения может занять больше времени, особенно если оно стало большим и сложным. Это замедляет процесс выпуска обновлений.
Высокая степень связанности компонентов может привести к проблемам, когда сбой в одном компоненте может повлиять на всю систему.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как Go обеспечивает безопасность типов и предотвращение ошибок времени выполнения?
Anonymous Quiz
90%
С помощью статической типизации и строгой проверки типов на этапе компиляции
7%
С помощью динамической типизации и проверок во время выполнения
2%
С помощью использования только встроенных типов данных
1%
С помощью глобальной блокировки
Легко масштабировать отдельные компоненты системы независимо друг от друга. Например, если один микросервис испытывает высокую нагрузку, его можно масштабировать, не затрагивая другие части системы.
Каждый микросервис может разрабатываться, тестироваться и развертываться независимо от других, что сокращает время разработки и улучшает скорость выпуска обновлений.
Разработчики могут использовать разные технологии, языки программирования и фреймворки для разных микросервисов, выбирая наиболее подходящие инструменты для каждой конкретной задачи.
Проблемы в одном микросервисе не приводят к сбою всего приложения. Это повышает устойчивость системы в целом, так как сбои ограничены контекстом конкретного микросервиса.
Маленькие независимые команды могут работать над отдельными микросервисами, что повышает продуктивность и ускоряет разработку новых функций.
Система делится на более мелкие и управляемые части, что облегчает понимание кода и упрощает поддержку.
Управление множеством микросервисов требует эффективной оркестрации и мониторинга. Это приводит к необходимости использования сложных инструментов и дополнительных затрат на администрирование.
Взаимодействие между микросервисами происходит через сеть, что может привести к увеличению задержек и необходимости управления сетевой нагрузкой.
Разработка и тестирование распределённой системы сложнее, чем монолита. Требуется учитывать межсервисное взаимодействие, консистентность данных и возможные сбои в сети.
Разделение данных между микросервисами может привести к дублированию данных и усложнению управления транзакциями, особенно если нужна консистентность данных между сервисами.
Поддержание совместимости между различными микросервисами и обеспечение их корректного взаимодействия требует дополнительного контроля и тестирования.
Управление конфигурацией для множества микросервисов становится сложнее, так как каждая служба может иметь свои собственные настройки и зависимости.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие основные преимущества использования интерфейсов в Go?
Anonymous Quiz
2%
Интерфейсы увеличивают производительность программы
96%
Интерфейсы позволяют реализовать полиморфизм и упрощают тестирование
0%
Интерфейсы предотвращают утечки памяти
1%
Интерфейсы автоматически синхронизируют горутины
Передача слайсов в разные горутины в Go может быть как безопасной, так и небезопасной в зависимости от контекста использования. Давайте рассмотрим, почему это так, и какие подходы позволяют обеспечить безопасность.
Слайсы в Go являются ссылочными типами, что означает, что они содержат указатель на массив в памяти, длину и емкость. Если несколько горутин одновременно модифицируют один и тот же слайс или его элементы, это может привести к состояниям гонки, некорректным данным и другим непредсказуемым результатам.
Если слайс передается в горутины только для чтения, это безопасно. Одновременное чтение данных не вызывает конфликтов. В этом примере горутины только читают значения из слайса, что безопасно.
package main
import (
"fmt"
"sync"
)
func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
for _, v := range slice {
wg.Add(1)
go func(val int) {
defer wg.Done()
fmt.Println(val)
}(v)
}
wg.Wait()
}
Если каждая горутина должна иметь независимую копию данных, можно передать копию слайса. Это устраняет возможность конфликтов при записи.
package main
import (
"fmt"
"sync"
)
func main() {
originalSlice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
for _, v := range originalSlice {
wg.Add(1)
go func(val int) {
defer wg.Done()
newSlice := make([]int, len(originalSlice))
copy(newSlice, originalSlice)
newSlice[0] = val
fmt.Println(newSlice)
}(v)
}
wg.Wait()
}
Если горутины должны одновременно читать и модифицировать слайс, необходимо использовать механизмы синхронизации, такие как мьютексы или каналы, чтобы обеспечить безопасный доступ к данным.
package main
import (
"fmt"
"sync"
)
func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
var mu sync.Mutex
for i := range slice {
wg.Add(1)
go func(index int) {
defer wg.Done()
mu.Lock()
slice[index] *= 2
mu.Unlock()
}(i)
}
wg.Wait()
fmt.Println(slice)
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как в Go осуществляется синхронизация между горутинами?
Anonymous Quiz
95%
С помощью мьютексов и каналов
2%
С помощью глобальных переменных
1%
С помощью таймеров
2%
С помощью блокировок на уровне пакетов
РПС (RPC, Remote Procedure Call) — это технология, которая позволяет программе вызывать функции (процедуры) на удалённых машинах, как если бы они были локальными. В контексте программирования на Go, РПС используется для организации взаимодействия между разными частями распределённых систем.
В современных приложениях часто необходимо взаимодействовать с различными сервисами, которые могут находиться на разных серверах. РПС позволяет реализовать это взаимодействие простым и прозрачным способом.
В архитектуре микросервисов разные части системы выполняются как независимые сервисы. РПС обеспечивает эффективное и удобное взаимодействие между этими сервисами.
РПС позволяет распределить нагрузку между несколькими серверами, что повышает производительность и масштабируемость системы.
net/rpc
, а также сторонние библиотеки, такие как gRPC, которые обеспечивают более широкие возможности и поддержку разных протоколов.// Сервисная часть
package main
import (
"net"
"net/rpc"
)
// Определяем структуру и методы, которые будут доступны через RPC
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
type Args struct {
A, B int
}
func main() {
arith := new(Arith)
rpc.Register(arith)
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("Listen error: ", err)
}
rpc.Accept(listener)
}
Multiply
для умножения двух чисел, и клиентскую часть, которая вызывает этот метод на удалённом сервере.// Клиентская часть
package main
import (
"fmt"
"log"
"net/rpc"
)
type Args struct {
A, B int
}
func main() {
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dialing error: ", err)
}
args := Args{2, 3}
var reply int
err = client.Call("Arith.Multiply", &args, &reply)
if err != nil {
log.Fatal("Arith error: ", err)
}
fmt.Printf("Result: %d\n", reply)
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие преимущества использования пакетов в Go?
Anonymous Quiz
2%
Пакеты увеличивают размер исполняемого файла
2%
Пакеты автоматически увеличивают производительность программы
3%
Пакеты устраняют необходимость в компиляции
93%
Пакеты помогают организовать код и повторно использовать его
HTTPS (HyperText Transfer Protocol Secure) — это расширение протокола HTTP, которое обеспечивает безопасную передачу данных между веб-браузером пользователя и сервером. HTTPS использует протоколы шифрования, такие как TLS (Transport Layer Security) или его предшественник SSL (Secure Sockets Layer), чтобы защитить передаваемые данные от перехвата и манипуляций.
Защита данных от перехвата посторонними лицами. Данные, передаваемые между клиентом и сервером, шифруются с помощью симметричного шифрования, а ключи для этого шифрования обмениваются с использованием асимметричного шифрования.
Подтверждение подлинности сервера (и иногда клиента) с помощью цифровых сертификатов. Сертификаты, выданные доверенными центрами сертификации (CA), подтверждают, что сервер принадлежит законному владельцу.
Обеспечение защиты данных от изменения во время передачи. Хеш-функции и контрольные суммы используются для проверки целостности передаваемых данных.
Клиент отправляет запрос на сервер, указывая, что хочет установить защищенное соединение (например, https://example.com). Сервер отвечает, отправляя свой цифровой сертификат, который содержит публичный ключ сервера и данные о сервере.
Клиент проверяет сертификат с помощью списка доверенных центров сертификации (CA), чтобы удостовериться в подлинности сервера.
Клиент и сервер используют асимметричное шифрование для обмена сессионными ключами. Эти ключи будут использоваться для симметричного шифрования данных во время сессии.
После установки защищенного соединения все данные между клиентом и сервером передаются в зашифрованном виде с использованием сессионных ключей.
Шифрование данных защищает их от перехвата и кражи, особенно на общественных сетях и Wi-Fi.
Наличие HTTPS улучшает доверие пользователей к веб-сайту, что может повысить количество посетителей и конверсии.
Поисковые системы, такие как Google, дают предпочтение сайтам, использующим HTTPS, в своих рейтингах.
HTTPS помогает защититься от атак типа "человек посередине" (MITM), при которых злоумышленники могут перехватывать и изменять данные.
Установка и поддержка защищенного соединения требует дополнительных вычислительных ресурсов, что может немного замедлить загрузку страниц.
Приобретение и обновление сертификатов могут требовать дополнительных затрат, хотя существуют и бесплатные решения, такие как Let’s Encrypt.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
SSL (Secure Sockets Layer) — это протокол, который обеспечивает безопасность передачи данных в интернете, используя шифрование. Он был разработан для защиты данных, передаваемых между клиентом (например, веб-браузером) и сервером (например, веб-сайтом), от перехвата и манипуляций.
Защита данных от перехвата и чтения посторонними лицами путем их шифрования.
Подтверждение подлинности сервера (и иногда клиента) с помощью цифровых сертификатов, что позволяет клиенту убедиться, что он подключен к настоящему серверу.
Проверка того, что данные не были изменены во время передачи, с помощью контрольных сумм и хеш-функций.
Клиент инициирует соединение с сервером, запрашивая защищенное соединение.
Сервер отправляет свой цифровой сертификат, который содержит его публичный ключ и информацию о сервере.
Клиент проверяет сертификат, используя доверенные центры сертификации (CA), чтобы удостовериться в подлинности сервера.
Клиент и сервер используют асимметричное шифрование для обмена ключами сеанса, которые затем используются для симметричного шифрования данных в течение сессии.
Все данные, передаваемые между клиентом и сервером, шифруются с использованием симметричных ключей, обеспечивая безопасность передачи.
При посещении веб-сайта с использованием HTTPS (например, https://example.com), SSL обеспечивает шифрование и безопасность данных, передаваемых между вашим браузером и сервером.
Никогда не был выпущен публично из-за серьезных уязвимостей.
Выпущен в 1995 году, но вскоре был признан небезопасным из-за множества уязвимостей.
Выпущен в 1996 году, значительно улучшил безопасность, но со временем также был признан устаревшим из-за уязвимостей (например, POODLE-атака).
SSL был заменен протоколом TLS, который является его преемником и предлагает улучшенную безопасность. Текущие версии TLS (1.2 и 1.3) используются вместо SSL.
TLS обеспечивает более сильное шифрование, лучшее управление сессионными ключами и устранение уязвимостей, найденных в SSL.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
TLS (Transport Layer Security) — протокол безопасности, который защищает данные, передаваемые через интернет, используя шифрование. TLS является преемником SSL (Secure Sockets Layer) и обеспечивает конфиденциальность, целостность и аутентификацию данных.
Защита данных от перехвата и чтения посторонними лицами. Данные шифруются с использованием симметричного шифрования, а ключи обмениваются асимметрично.
Подтверждение подлинности сервера и клиента с помощью цифровых сертификатов, выданных доверенными центрами сертификации (CA).
Защита данных от изменения во время передачи с помощью контрольных сумм и хеш-функций.
Клиент отправляет запрос на сервер для установки защищенного соединения.
Сервер отправляет свой цифровой сертификат, который клиент проверяет с помощью CA.
Клиент и сервер обмениваются сессионными ключами, используя асимметричное шифрование, и далее используют их для симметричного шифрования данных.
Все данные передаются в зашифрованном виде.
Улучшение по сравнению с SSL 3.0, но устаревший.
Дополнительные защиты, но также устаревший.
Современные алгоритмы шифрования, улучшенная безопасность.
Современные алгоритмы шифрования и хеширования.
TLS 1.3 снижает задержки при установке соединения.
Поддерживается большинством современных браузеров и серверов.
Особенно для крупных систем.
Шифрование требует дополнительных вычислительных ресурсов.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TLS Example</title>
</head>
<body>
<h1>Welcome to Secure Site</h1>
<p>Your connection to this site is secure with HTTPS using TLS.</p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Да, между SSL (Secure Sockets Layer) и TLS (Transport Layer Security) есть отличия. TLS является улучшенной и более безопасной версией SSL.
SSL 1.0: Никогда не был выпущен публично из-за серьезных уязвимостей.
SSL 2.0: Выпущен в 1995 году, но вскоре был признан небезопасным из-за множества уязвимостей.
SSL 3.0: Выпущен в 1996 году, значительно улучшил безопасность, но со временем также был признан устаревшим из-за уязвимостей (например, POODLE-атака).
TLS 1.0: Выпущен в 1999 году как обновление SSL 3.0. Включает исправления безопасности и улучшения.
TLS 1.1: Выпущен в 2006 году с дополнительными защитами от некоторых атак.
TLS 1.2: Выпущен в 2008 году, поддерживает современные алгоритмы шифрования и хеширования.
TLS 1.3: Выпущен в 2018 году, значительно улучшена безопасность и производительность, упрощен процесс установки соединения.
SSL: Поддерживает более старые и менее безопасные алгоритмы шифрования.
TLS: Поддерживает более современные и безопасные алгоритмы шифрования. TLS 1.3 исключает поддержку устаревших алгоритмов и предлагает только современные безопасные алгоритмы.
SSL: Более сложный процесс рукопожатия, включающий несколько шагов, что делает его уязвимым для некоторых атак.
TLS: Улучшенный процесс рукопожатия, включая использование HMAC (Hash-based Message Authentication Code) для обеспечения целостности сообщения. TLS 1.3 значительно упрощает и ускоряет процесс рукопожатия.
SSL: Использует комбинацию MD5 и SHA-1 для целостности данных, что не так безопасно по современным стандартам.
TLS: Использует HMAC с SHA-256 и другими современными алгоритмами для обеспечения целостности данных.
SSL: Меньше возможностей для управления сеансами.
TLS: Включает улучшенные механизмы для управления сеансами, такие как возобновление сеансов, что позволяет экономить время и ресурсы при повторных подключениях.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Для проверки типа переменной во время выполнения используется конструкция type assertion:
value, ok := x.(T)
, где T
— предполагаемый тип, а ok
указывает, совпал ли тип. Также можно использовать type switch: switch v := x.(type) { case int: // действия для int case string: // действия для string default: // другие типы }
.Пакет
reflect
предоставляет механизмы для получения информации о типах переменных во время выполнения.package main
import (
"fmt"
"reflect"
)
func main() {
var x interface{} = 42
// Получаем тип переменной x
t := reflect.TypeOf(x)
fmt.Println("Type:", t)
}
Этот метод позволяет проверить, соответствует ли переменная конкретному типу, и извлечь значение, если это так.
package main
import "fmt"
func main() {
var x interface{} = 42
// Проверка типа и извлечение значения
if val, ok := x.(int); ok {
fmt.Println("x is an int:", val)
} else {
fmt.Println("x is not an int")
}
}
Этот метод удобен, если нужно проверить переменную на соответствие нескольким типам.
package main
import "fmt"
func main() {
var x interface{} = "Hello, World!"
switch v := x.(type) {
case int:
fmt.Println("x is an int:", v)
case string:
fmt.Println("x is a string:", v)
case bool:
fmt.Println("x is a bool:", v)
default:
fmt.Println("x is of unknown type")
}
}
reflect.TypeOf(x)
: Возвращает объект типа reflect.Type
, который содержит информацию о типе переменной x
.x.(int)
: Проверяет, является ли x
переменной типа int
, и возвращает значение и булево значение, указывающее, удалось ли утверждение типа.switch v := x.(type)
: Позволяет проверить переменную x
на соответствие нескольким типам в одном блоке switch
.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это представляет собой сложную задачу из-за множества компонентов, взаимодействующих друг с другом в различных сетевых условиях.
Проверка корректности отдельных компонентов системы. Используйте библиотеки для написания тестов, такие как
testing
в Go. Интеграционное тестирование Моки (mocking) и заглушки (stubs) для изоляции компонентов.package main
import (
"testing"
)
func TestAdd(t *testing.T) {
result := Add(1, 2)
if result != 3 {
t.Errorf("Expected 3, got %d", result)
}
}
Проверка взаимодействия между компонентами системы.
Используйте контейнеризацию (например, Docker) для поднятия среды тестирования. Тестирование с использованием реальных баз данных, очередей сообщений и других внешних сервисов.
version: '3'
services:
app:
image: myapp:test
depends_on:
- db
db:
image: postgres:latest
environment:
POSTGRES_DB: testdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
Проверка всей системы в целом, включая все её компоненты и их взаимодействие. Сценарии end-to-end (E2E) тестирования. Тестирование пользовательского интерфейса и API. Selenium для тестирования веб-интерфейсов. Postman или REST-assured для тестирования API.
Проверка системы на устойчивость к высоким нагрузкам и определение её производительности. Нагрузочные тесты для проверки, как система справляется с увеличением числа пользователей или запросов. Тесты стресс-тестирования для выявления пределов производительности системы. Тесты стабильности для проверки системы под постоянной нагрузкой в течение длительного времени. Apache JMeter Gatling Locust
Проверка способности системы справляться с отказами отдельных компонентов или сетевых сбоев. Имитация отказов компонентов (например, остановка сервиса или отключение узла).
Инструменты для хаос-тестирования (chaos engineering). Chaos Monkey от Netflix Gremlin
Проверка системы на наличие уязвимостей и обеспечение её защиты от атак.Сканы уязвимостей. Тестирование на проникновение (penetration testing). OWASP ZAP Burp Suite
Интеграция тестирования в процесс CI/CD для автоматизации и ускорения релизов. Настройка CI/CD конвейера для автоматического выполнения тестов при каждом изменении кода. Использование инструментов, таких как Jenkins, GitLab CI/CD или CircleCI.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM