Перейти к содержимому

Tutu / Туту

// Описание: В этом коде описана логика работы корзины, в которую можно добавлять продукты, убирать их, а также создавать заказ.
// Задача: Нужно провести Code Review и предложить улучшения по данному функционалу.
package cart
import (
"fmt "
"net/smtp "
)
var items []Product
var vatRate = 10.0
var removalChannel chan bool
var 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,
}
}
  • Что можешь сказать про 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