Tutu / Туту
Скрининг
Заголовок раздела «Скрининг»Задача: (код без описания) go/basics
Заголовок раздела «Задача: (код без описания) go/basics»// Описание: В этом коде описана логика работы корзины, в которую можно добавлять продукты, убирать их, а также создавать заказ.// Задача: Нужно провести Code Review и предложить улучшения по данному функционалу.
package cart
import ( "fmt " "net/smtp ")
var items []Productvar vatRate = 10.0var removalChannel chan boolvar order Order
type Product struct { NameOfProduct string PriceOfProduct float32}
type Order struct { Items []Product}
func init() { items = make([]Product, 100) removalChannel = make(chan bool, 1)}
func AddItemToShoppingCart(item Product) { items = append(items, item)}
func RemoveItemFromShoppingCart(nameOfItem string) { go func() { for i, item := range items { if item.NameOfProduct == nameOfItem { items = append(items[:i], items[i+1:]...) removalChannel <- true
return } }
removalChannel <- false }()
<-removalChannel}
func CalculateVAT() float64 { subTotal := 0.0 for _, item := range items { price := float64(item.PriceOfProduct) subTotal += price }
vatAmount := subTotal * (vatRate / 100)
return vatAmount}
func ListAndCalculateVAT() float64 { subTotal := 0.0 for _, item := range items { fmt.Printf("Item Name: %s, Item Price: $%.2f\n ", item.NameOfProduct, item.PriceOfProduct)
subTotal += float64(item.PriceOfProduct) }
vatAmount := CalculateVAT() totalWithVAT := subTotal + vatAmount
fmt.Printf("The total price with VAT: $%.2f\n ", totalWithVAT)
return totalWithVAT}
func CreateOrder(customerEmail string) { totalPrice := ListAndCalculateVAT()
orderDetails := "Thank you for your order!\n\n " orderDetails += "Here are the items in your order:\n "
for _, item := range items { orderDetails += fmt.Sprintf("- %s: $%.2f\n ", item.NameOfProduct, item.PriceOfProduct) }
orderDetails += fmt.Sprintf("\nTotal (including VAT): $%.2f\n ", totalPrice)
subject := "Your Order Confirmation "
err := SendOrderConfirmationEmail(customerEmail, subject, orderDetails)
order = Order{Items: items}
if err != nil { fmt.Println("Failed to send order confirmation email:", err) }}
func SendOrderConfirmationEmail(to string, subject string, body string) error { from := "your-email@example.com " password := "your-email-password " smtpHost := "smtp.example.com " smtpPort := "587 "
auth := smtp.PlainAuth("", from, password, smtpHost)
message := []byte("Subject: " + subject + "\r\n " + "To: " + to + "\r\n " + "From: " + from + "\r\n " + "\r\n " + body)
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, []string{to}, message) if err != nil { return err }
return nil}Вопросы
Заголовок раздела «Вопросы»- Что такое конкурентность и она устроена в Go?
go/concurrency - С какими профилями нагрузки Go лучше всего стравляется?
go/stdlib-tooling - Что такое io-bound нагрузка?
linux-os/processes - Всегда ли код в Go выполняется параллельно?
go/concurrency - Что можешь сказать про пакет sync?
go/sync - Чем отличается errgroup от WaitGroup?
go/sync - Какая ключевая особенность есть в errgroup?
go/sync - Почему часто используют обычную мапу с мьютексом, а не мапу из пакета sync?
go/sync - Почему нужно хранить интерфейс там где он используется?
go/interfaces - Всегда ли атомик быстрее мьютекса?
go/sync - Что можешь сказать про новые фитчи в версии 1.24?
go/stdlib-tooling
// Написать функцию, которая отсортирует слайс
func main() { slice := []string{"a ", "b ", "d ", "c ", "f ", "e "}
usort(slice)
fmt.Printf("%+v\n ", slice)}// Есть поток данных, в виде идентификаторов отелей, для каждого// отеля нужно сделать поисковый запрос (запрос выполняется// минимум 500ms) и отправить результаты в другой поток.
type SearchResult struct { HotelID int}
func main() { dataCh := make(chan int)
go func() { for i := 0; i < 10; i++ { dataCh <- i }
defer close(dataCh) }()
}
func search(hotelID int) SearchResult { time.Sleep(time.Millisecond * 500)
return SearchResult{ HotelID: hotelID, }}Секция 2
Заголовок раздела «Секция 2»- Что можешь сказать про hashmap?
go/maps - Задача на грутины и race condition.
go/sync - Какие примитивы синхронизации знаешь?
go/sync - Как Go решает проблему в RWMutex, если бесконечно висит lock на чтение и когда произойдет lock на запись?
go/sync - Работал ли с брокерами?
brokers/general - Задача: есть приложение в разных дата центрах. Каждая из копий содержит локальный кэш с информацией о пользователях. Есть необходимость сбросить кэш. Например отзываем права пользователей. Как это реализовать?
nosql-cache/caching - Что можешь сказать про gRPC?
network/grpc - Что такое идемпотентность в REST?
architecture/microservices - Какие индексы есть в Postgres?
sql/indexes - Почему в реляц базах обычно btrее используется, а не hash?
sql/indexes - В каких выражениях используется индекс?
sql/indexes - Какие недостатки есть у hash индекса?
sql/indexes - Нашел ли применение дженерикам в Go?
go/generics