Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2.01K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
❇️زمان‌بندی (Preemptive Scheduling)
سیستم عامل یا زمان‌بند به طور مستقل و بدون دخالت وظایف، کنترل اجرای وظایف را مدیریت می‌کند. این روش به زمان‌بند اجازه می‌دهد تا وظایف را بر اساس سیاست‌های خاص، مانند اولویت، مدت زمان اجرا یا وضعیت فعلی سیستم، پیش‌گیرانه تغییر دهد.

🔵ویژگی‌ها:
کنترل سیستم عامل: سیستم عامل می‌تواند اجرای وظایف را در هر زمان متوقف کرده و وظیفه دیگری را اجرا کند.
پاسخ‌دهی بهتر: زمان‌بند می‌تواند به سرعت به نیازهای سیستم پاسخ دهد، که منجر به افزایش کارایی و عملکرد بهتر می‌شود.
مدیریت ساده‌تر وظایف: توسعه‌دهندگان نیازی به مدیریت صریح بازگرداندن کنترل ندارند، زیرا سیستم عامل این کار را انجام می‌دهد.

🔴معایب:
پیچیدگی بیشتر: پیاده‌سازی این روش نیاز به مکانیزم‌های پیچیده‌تری برای مدیریت تغییرات وظایف دارد.
احتمال وضعیت‌های رقابتی: به دلیل تغییرات ناگهانی وظایف، وظایف باید برای شرایط رقابتی (race conditions) آماده باشند و از روش‌های همگام‌سازی مناسب استفاده کنند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4🍾2💊1
نقشه راه مهندس تست نرم افزار
🔵 https://automationcamp.ir/qa-roadmap


👑 @gopher_academy | 💸 Donate | 💋 Boost
🍾3👍1
Which synchronization technique is used to wait for multiple goroutines to finish executing?
Anonymous Quiz
14%
Mutex
7%
Defer
75%
WaitGroup
4%
select
🍓6
✍️برای برقراری ارتباط بین دو سرویس با استفاده از gRPC
در زبان برنامه‌نویسی Go، باید چند مرحله اصلی را دنبال کنید. این مراحل شامل تعریف پروتکل ارتباطی، تولید کدهای gRPC، پیاده‌سازی سرور و کلاینت، و در نهایت تست ارتباط است. در زیر به تفصیل این مراحل را توضیح می‌دهم:

❇️1. تعریف پروتکل ارتباطی:
- ابتدا فایل .proto را تعریف کنید که شامل تعریف سرویس‌ها و پیام‌های مورد استفاده برای ارتباط بین دو سرویس است.
- به عنوان مثال، فایل service.proto:


    syntax = "proto3";

package mypackage;

service MyService {
rpc MyMethod (MyRequest) returns (MyResponse);
}

message MyRequest {
string message = 1;
}

message MyResponse {
string response = 1;
}

❇️2. تولید کدهای gRPC:
- با استفاده از protoc و پلاگین Go، کدهای مورد نیاز برای کلاینت و سرور را تولید کنید.
- ابتدا پلاگین gRPC برای Go را نصب کنید:


    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

- سپس دستور زیر را برای تولید کدهای Go اجرا کنید:


    protoc --go_out=. --go-grpc_out=. service.proto

❇️3. پیاده‌سازی سرور:
- کدی که سرور gRPC را پیاده‌سازی می‌کند. به عنوان مثال، در Go:


    package main

import (
"context"
"log"
"net"

"google.golang.org/grpc"
pb "path/to/your/service/package"
)

type server struct {
pb.UnimplementedMyServiceServer
}

func (s *server) MyMethod(ctx context.Context, req *pb.MyRequest) (*pb.MyResponse, error) {
return &pb.MyResponse{Response: "Hello, " + req.GetMessage()}, nil
}

func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterMyServiceServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}

❇️4. پیاده‌سازی کلاینت:
- کدی که کلاینت gRPC را پیاده‌سازی می‌کند. به عنوان مثال، در Go:


    package main

import (
"context"
"log"
"time"

"google.golang.org/grpc"
pb "path/to/your/service/package"
)

func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewMyServiceClient(conn)

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

r, err := c.MyMethod(ctx, &pb.MyRequest{Message: "World"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetResponse())
}

❇️5. راه‌اندازی و تست:
- ابتدا سرور را راه‌اندازی کنید و سپس کلاینت را اجرا کنید تا ارتباط بین دو سرویس برقرار شود و داده‌ها ارسال و دریافت شوند.

با این مراحل، شما می‌توانید دو سرویس را با استفاده از gRPC در زبان Go به هم متصل کنید و ارتباط سریع و کارآمدی بین آن‌ها برقرار کنید.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍8💋42🔥1🎉1
✍️برای ارتباط بین دو سرویس Go با استفاده از Kafka
باید چند مرحله را طی کنید. این مراحل شامل نصب و تنظیم Kafka، ایجاد موضوعات (topics) در Kafka، نوشتن تولیدکننده (producer) و مصرف‌کننده (consumer) در Go، و اجرای سرویس‌ها است. در زیر یک راهنمای کامل برای این فرآیند آورده شده است:

❇️ 1. نصب و راه‌اندازی Kafka
ابتدا باید Kafka را نصب و راه‌اندازی کنید. می‌توانید از Docker برای ساده‌تر کردن این فرآیند استفاده کنید.

راه‌اندازی Kafka با Docker:
# 
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

# راه‌اندازی Zookeeper
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper

# راه‌اندازی Kafka
docker run -d --name kafka -p 9092:9092 --link zookeeper wurstmeister/kafka \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_BROKER_ID=1

❇️2. ایجاد موضوع (Topic) در Kafka
برای ایجاد موضوع در Kafka از ابزارهای CLI استفاده کنید.

docker exec kafka kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

❇️ 3. نصب کتابخانه‌های Kafka برای Go

می‌توانید از کتابخانه‌ی [sarama](https://github.com/Shopify/sarama) برای کار با Kafka در Go استفاده کنید.

go get github.com/Shopify/sarama

❇️4. نوشتن تولیدکننده (Producer) در Go
کد زیر یک تولیدکننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"
"os"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"

config := sarama.NewConfig()
config.Producer.Return.Successes = true

producer, err := sarama.NewSyncProducer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start producer:", err)
}
defer producer.Close()

msg := &sarama.ProducerMessage{
Topic: topic,
Key: sarama.StringEncoder("key"),
Value: sarama.StringEncoder("value"),
}

partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Fatalln("Failed to send message:", err)
}

log.Printf("Message is stored in topic(%s)/partition(%d)/offset(%d)\n", topic, partition, offset)
}

❇️5. نوشتن مصرف‌کننده (Consumer) در Go
کد زیر یک مصرف‌کننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"
config := sarama.NewConfig()

master, err := sarama.NewConsumer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start consumer:", err)
}
defer master.Close()

consumer, err := master.ConsumePartition(topic, 0, sarama.OffsetOldest)
if err != nil {
log.Fatalln("Failed to start partition consumer:", err)
}
defer consumer.Close()

for message := range consumer.Messages() {
log.Printf("Consumed message offset %d: %s\n", message.Offset, string(message.Value))
}
}



2. موضوع را در Kafka ایجاد کنید.
3. کد تولیدکننده را اجرا کنید تا پیام‌ها به Kafka ارسال شوند.
4. کد مصرف‌کننده را اجرا کنید تا پیام‌های دریافتی از Kafka را پردازش کند.

با این روش، می‌توانید دو سرویس Go را با استفاده از Kafka به هم متصل کنید. Kafka به عنوان یک پیام‌رسان با کارایی بالا، ارتباط غیرهمزمان بین سرویس‌ها را ممکن می‌سازد و از مدیریت بار کاری به خوبی پشتیبانی می‌کند.


👑 @gopher_academy | 💸 Donate | 💋 Boost
9👍3🔥3🍾2💯1

👑 @gopher_academy | 💸 Donate | 💋 Boost
💊8👍7💯41


📌 Backend Software Engineer Golang for Lounge (all genders)

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: zalando

📍 Location: GERMANY

🔗 Tags: #golang #git #kubernetes #aws #microservices



📌 BackEnd (Golang) Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: moon active

📍 Location: POLAND

🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍43
✍️انتخاب بین Kafka و gRPC برای ارتباط بین سرویس‌ها به نیازها و الزامات خاص پروژه شما بستگی دارد. هر یک از این ابزارها دارای مزایا و معایب خاص خود هستند که در زیر به آن‌ها پرداخته شده است تا بتوانید تصمیم بهتری بگیرید:

💜Kafka
🔻مزایا:
🔹- غیرهمزمانی و تحمل‌پذیری بالا: Kafka به عنوان یک پیام‌رسان غیرهمزمان عمل می‌کند و می‌تواند حجم بالایی از داده‌ها را مدیریت کند.
🔹- مقیاس‌پذیری: Kafka برای مدیریت مقیاس‌پذیری بالا و پردازش داده‌های بزرگ طراحی شده است.
🔹- قابلیت ذخیره‌سازی پیام‌ها: Kafka پیام‌ها را برای مدت زمان مشخصی ذخیره می‌کند، بنابراین مصرف‌کنندگان می‌توانند پیام‌ها را با تأخیر پردازش کنند.
🔹- پشتیبانی از پردازش داده‌های جریانی: Kafka به خوبی با سیستم‌های پردازش داده‌های جریانی (Stream Processing) مانند Apache Flink و Apache Storm سازگار است.

🔻معایب:
🔹- پیچیدگی در تنظیم و نگهداری: راه‌اندازی و نگهداری Kafka ممکن است پیچیده‌تر از برخی ابزارهای دیگر باشد.
🔹- تأخیر: به دلیل ماهیت غیرهمزمانی، ممکن است تأخیر بیشتری نسبت به ارتباطات همزمان مانند gRPC داشته باشد.


💜gRPC
🔻مزایا:
🔹- کارایی بالا و تأخیر کم: gRPC از پروتکل HTTP/2 و فرمت باینری پروتوباف استفاده می‌کند که تأخیر را کاهش می‌دهد و کارایی را افزایش می‌دهد.
🔹- پشتیبانی از ارتباط دوجهته و استریمینگ: gRPC از استریمینگ دوجهته پشتیبانی می‌کند که برای برخی کاربردها بسیار مفید است.
🔹- پشتیبانی از چندین زبان: gRPC از بسیاری از زبان‌های برنامه‌نویسی پشتیبانی می‌کند و به راحتی می‌توان از آن در محیط‌های مختلف استفاده کرد.

🔻معایب:
🔹- عدم ذخیره‌سازی پیام‌ها: gRPC پیام‌ها را ذخیره نمی‌کند، بنابراین اگر مصرف‌کننده در دسترس نباشد، پیام‌ها از دست می‌روند.
🔹- عدم پشتیبانی از غیرهمزمانی به شکل بومی: gRPC به طور بومی برای ارتباطات همزمان طراحی شده است، بنابراین برای کاربردهای غیرهمزمان ممکن است مناسب نباشد.

🤝انتخاب بهترین روش
در نهایت، انتخاب بین Kafka و gRPC به نیازهای خاص پروژه شما بستگی دارد:

- اگر نیاز به پردازش داده‌های بزرگ، غیرهمزمانی، و تحمل‌پذیری بالا دارید، Kafka انتخاب بهتری است.
- اگر نیاز به ارتباط سریع و با تأخیر کم، و پشتیبانی از ارتباطات دوجهته دارید، gRPC مناسب‌تر است.

🤝 ترکیب Kafka و gRPC
در برخی پروژه‌ها، ترکیب Kafka و gRPC می‌تواند مزایای هر دو را به شما بدهد. برای مثال، می‌توانید از gRPC برای ارتباطات سریع و با تأخیر کم بین سرویس‌ها استفاده کنید و از Kafka برای پردازش داده‌های جریانی و مدیریت بار کاری بهره ببرید.

🔥🔥 مثال ترکیب Kafka و gRPC
فرض کنید شما یک سیستم سفارش‌دهی آنلاین دارید:
- از gRPC برای مدیریت درخواست‌های بلادرنگ (real-time) مانند ثبت سفارش و دریافت وضعیت سفارش استفاده می‌کنید.
- از Kafka برای پردازش‌های پس‌زمینه‌ای (background processing) مانند ارسال ایمیل‌های تأیید سفارش و به‌روزرسانی موجودی کالا استفاده می‌کنید.

این ترکیب به شما اجازه می‌دهد تا از مزایای هر دو ابزار بهره‌مند شوید و سیستم خود را بهینه‌تر کنید.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10🕊1🍾1💋1
🔴چندتا مقاله جالب که امروز توی golang weekly منتشر شده

🟢 اگر میخوای بهتر در مورد چنل ها توی گولنگ بدونی این مقاله خوبیه
🔵 https://www.dolthub.com/blog/2024-06-21-channel-three-ways/

🟢 یه مقاله جذاب که خودم به شخصه منو یاد دانشگاه انداخت مقاله زیر هست که میگه ساخت یک ریجیکس ار ابتدا در گو
🔵 https://lewismetcalf.com/series/making-regex-from-scratch-in-go/

🟢 راهنمای عملی برای به روز رسانی ماژول Go
🔵 https://carlosbecker.com/posts/pragmatic-gomod-bump/

🟢 اگر تست می نویسی مثل بعضی ها😅 این مقاله خوبیه
🔵 https://henvic.dev/posts/testing-go/

🟢 هفت اشتباه رایج در استفاده از اینترفیس ها
🔵 https://medium.com/@andreiboar/7-common-interface-mistakes-in-go-1d3f8e58be60

🟢 اگر از چت جی پی تی توی کدهات میخوای استفاده کنی این کتابخونه خوبیه
🔵 https://github.com/sashabaranov/go-openai

🟢 اگر دنبال یه کتابخونه برای استفاده از متغیر های محیطی توی کدت هستی اینم کتابخونه خوبیه البته خودم فعلن استفاده نکردم
🔵 https://github.com/caarlos0/env



#golang_weekly

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥52👍2
What mechanism does Go use to manage memory automatically?
Anonymous Quiz
85%
Garbage collection
10%
Reference counting
5%
External memory manager*
👍4
📌 BackEnd (Golang) Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: moon active

📍 Location: POLAND

⌨️ Category: #Programming

🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql



📌 Staff Backend Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: plexus resource solutions

📍 Location: CANADA

⌨️ Category: #Programming

🔗 Tags: #golang #microservices #cloud #blockchain


📌 Backend Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: sword health

📍 Location: PORTUGAL

⌨️ Category: #Programming

🔗 Tags: #nosql #golang #redis #c #responsive #sql


👑 @gopher_academy | 💸 Donate | 💋 Boost
1
✍️فرق kafka و rabbitmq

🔵معماری
🟢Kafka:

🔻مدل انتشار-اشتراک: Kafka بر اساس مدل انتشار-اشتراک (publish-subscribe) کار می‌کند. تولیدکنندگان پیام‌ها را به مباحث (topics) می‌فرستند و مصرف‌کنندگان پیام‌ها را از این مباحث می‌خوانند.
🔻ذخیره‌سازی پایدار: Kafka پیام‌ها را به صورت پایدار در دیسک ذخیره می‌کند و به مصرف‌کنندگان اجازه می‌دهد که پیام‌ها را بر اساس آفست (offset) خاصی دوباره بخوانند.
🔻مقیاس‌پذیری: Kafka به راحتی مقیاس‌پذیر است و می‌تواند به صورت افقی با افزودن نودهای بیشتر در کلاستر (cluster) خود گسترش یابد.
🔻کارایی بالا: Kafka برای پردازش حجم زیادی از داده‌ها با تاخیر کم و توان عملیاتی بالا طراحی شده است.
🟢RabbitMQ:

🔻مدل صف-پیام: RabbitMQ بر اساس مدل صف-پیام (message queue) کار می‌کند. پیام‌ها در صف‌ها قرار می‌گیرند و مصرف‌کنندگان پیام‌ها را از صف‌ها می‌خوانند.
🔻قابلیت‌های مسیریابی پیشرفته: RabbitMQ از انواع مختلف مبادلات (exchanges) مانند مستقیم، موضوعی و هدرها برای مسیریابی پیام‌ها استفاده می‌کند.
🔻پشتیبانی از پروتکل‌های مختلف: RabbitMQ از پروتکل‌های مختلف پیام‌رسانی مانند AMQP، MQTT و STOMP پشتیبانی می‌کند.
🔻سادگی: RabbitMQ به راحتی قابل نصب و پیکربندی است و برای موارد استفاده ساده‌تر بسیار مناسب است.

🔵موارد استفاده
🟢Kafka:

🔻پردازش داده‌های جریانی: Kafka برای پردازش داده‌های جریانی و تجزیه و تحلیل داده‌های بزرگ در زمان واقعی بسیار مناسب است.
🔻سیستم‌های ثبت تراکنش (log): Kafka به عنوان یک سیستم ثبت تراکنش توزیع شده برای نگهداری و پردازش لاگ‌های بزرگ استفاده می‌شود.
🔻میکروسرویس‌ها: Kafka به عنوان یک سیستم پیام‌رسانی توزیع شده برای ارتباط بین میکروسرویس‌ها استفاده می‌شود.

🟢RabbitMQ:

🔻میکروسرویس‌ها: RabbitMQ نیز برای ارتباط بین میکروسرویس‌ها مناسب است، به ویژه در مواردی که نیاز به مسیریابی پیشرفته پیام‌ها وجود دارد.
🔻مدیریت وظایف: RabbitMQ برای مدیریت و پردازش وظایف پس‌زمینه مناسب است.
🔻سیستم‌های صف: RabbitMQ برای مواردی که نیاز به صف‌های ساده برای پیام‌رسانی و مدیریت بار کاری وجود دارد، مناسب است.

🔵کارایی و مقیاس‌پذیری
🟢Kafka:

🔻توان عملیاتی بالا: Kafka برای پردازش حجم زیادی از داده‌ها با توان عملیاتی بالا و تاخیر کم طراحی شده است.
🔻مقیاس‌پذیری افقی: Kafka به راحتی با افزودن نودهای بیشتر به کلاستر خود مقیاس‌پذیر است.
🟢RabbitMQ:

🔻کارایی متوسط: RabbitMQ نیز کارایی بالایی دارد، اما در مقایسه با Kafka ممکن است برای حجم بسیار زیاد داده‌ها کارایی کمتری داشته باشد.
🔻مقیاس‌پذیری: RabbitMQ به صورت افقی مقیاس‌پذیر است، اما ممکن است برای مقیاس‌بندی به اندازه Kafka بهینه نباشد.

🥂جمع‌بندی
🟢Kafka:

🔻مناسب برای پردازش داده‌های جریانی، سیستم‌های ثبت تراکنش و ارتباط بین میکروسرویس‌ها با حجم بالای داده‌ها.
🔻توان عملیاتی بالا و مقیاس‌پذیری افقی عالی.
🟢RabbitMQ:

🔻مناسب برای مدیریت وظایف، مسیریابی پیشرفته پیام‌ها و سیستم‌های صف با نیاز به پشتیبانی از پروتکل‌های مختلف.
🔻سادگی در نصب و پیکربندی و قابلیت‌های مسیریابی پیشرفته.


👑 @gopher_academy | 💸 Donate | 💋 Boost
5👍1🍾1🎃1
7 استراتژی مهم برای اسکیل کردن دیتابیس تون👌

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍9
✍️در زبان برنامه‌نویسی Go و به ویژه در کتابخانه net/http`، دو مقدار `nil و http.NoBody تفاوت‌های مهمی دارند که باید به آن‌ها توجه کنید. این تفاوت‌ها به ویژه در زمینه استفاده از درخواست‌ها (requests) و پاسخ‌ها (responses) اهمیت پیدا می‌کنند.

🟢nil

در Go، nil می‌تواند به عنوان مقدار پیش‌فرض برای انواع اشاره‌گرها، رابط‌ها (interfaces)، نقشه‌ها (maps)، اسلایس‌ها (slices)، کانال‌ها (channels) و توابع استفاده شود. وقتی که یک متغیر از نوع اشاره‌گر یا رابط مقدار nil دارد، به این معنی است که به هیچ چیز اشاره نمی‌کند یا مقداردهی نشده است.

🔵 ویژگی‌ها:
1. عدم اشاره به هیچ چیز: nil به این معنی است که هیچ مقدار یا آدرسی وجود ندارد.
2. پیش‌فرض برای اشاره‌گرها و رابط‌ها: بسیاری از انواع داده‌ها می‌توانند مقدار nil داشته باشند، از جمله *http.Request.Body.

🟢http.NoBody

اhttp.NoBody یک مقدار خاص در بسته net/http است که به طور خاص به عنوان یک جایگزین برای بدنه‌ی (body) خالی در درخواست‌ها و پاسخ‌ها استفاده می‌شود. این مقدار به طور خاص برای بهینه‌سازی و جلوگیری از استفاده از منابع غیرضروری طراحی شده است.

🔵 ویژگی‌ها:
1. بدنه خالی بهینه شده: http.NoBody به جای استفاده از یک اشاره‌گر nil برای بدنه خالی، به عنوان یک جایگزین بهینه شده استفاده می‌شود.
2. پیاده‌سازی `io.ReadCloser`: http.NoBody یک نوع خاص است که io.ReadCloser را پیاده‌سازی می‌کند و همیشه خواندن صفر بایت را برمی‌گرداند و بستن بدون خطا.

🔵 مزایا:
1. کاهش استفاده از منابع: به دلیل پیاده‌سازی خاص، استفاده از http.NoBody می‌تواند منجر به کاهش استفاده از منابع و بهینه‌سازی عملکرد شود.
2. سازگاری با رابط‌ها: چون http.NoBody رابط io.ReadCloser را پیاده‌سازی می‌کند، می‌توان آن را در جاهایی که انتظار io.ReadCloser می‌رود، به کار برد.

🔵 مقایسه در زمینه HTTP
هنگام کار با درخواست‌ها (requests) و پاسخ‌ها (responses) در net/http`، تفاوت بین استفاده از `nil و http.NoBody مهم است.

🔵 مثال: ایجاد یک درخواست HTTP با بدنه خالی
استفاده از nil:

req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
// handle error
}


در اینجا، بدنه درخواست به صورت nil تعیین می‌شود که به معنای عدم وجود بدنه است.
🔵استفاده از http.NoBody:

req, err := http.NewRequest("GET", "http://example.com", http.NoBody)
if err != nil {
// handle error
}


در اینجا، بدنه درخواست به طور صریح به عنوان http.NoBody تنظیم می‌شود که نشان‌دهنده یک بدنه خالی بهینه شده است.

🍾 جمع‌بندی

- `nil`:
- نشان‌دهنده عدم وجود بدنه یا مقدار.
- مقدار پیش‌فرض برای انواع اشاره‌گرها و رابط‌ها.
- می‌تواند برای بدنه‌های خالی استفاده شود، اما از لحاظ عملکردی بهینه نیست.

- `http.NoBody`:
- نشان‌دهنده یک بدنه خالی بهینه شده برای درخواست‌ها و پاسخ‌ها.
- پیاده‌سازی io.ReadCloser.
- بهینه‌تر برای مواردی که بدنه خالی نیاز است، به ویژه در زمینه HTTP.

به طور کلی، استفاده از http.NoBody به جای nil در مواردی که بدنه خالی در HTTP نیاز است، می‌تواند به بهبود عملکرد و کاهش استفاده از منابع کمک کند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍123🔥1🍾1💅1
Massimo DevMassimo Dev

#برنامه_نویس سنیور کیه واقعا؟

فقط یک جمله:
کسی که برای پیچیده‌ترین صورت مسأله‌ها، ساده‌ترین راه حل‌ها رو ارائه میده.

اگر حس می کنید کدنویسی پیچیده یعنی سنیوریتی، باخت دادید تا الان.

مشتی باشید!

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥18👍9🍾2💋1
برای رسیدن به متریک مناسب سرویس تون یه سری راه حل اینجا گذاشته

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍52🕊1
Which of the following is true about Go's deadlock detection?
Anonymous Quiz
10%
Go detects deadlocks only in the main function
90%
The Go runtime can detect deadlocks and panic if it occurs
🏆4🔥1🕊1
لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها
👇👇👇👇

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5