[৪.৫] প্র্যাকটিস প্রব্লেমস (Practice Problems)
1. একটি প্রোগ্রাম লিখুন যা দুটি গো-রুটিন তৈরি করে। প্রথম গো-রুটিনে 0 থেকে 10 পর্যন্ত ইন্টিজার তৈরি করে এবং একটি Channel এর মাধ্যমে দ্বিতীয় গো-রুটিনে পাঠায়। দ্বিতীয় গো-রুটিন ইন্টিজার গ্রহণ করে এবং সেগুলোকে কনসোলে প্রিন্ট করে।
2. একটি প্রোগ্রাম লিখুন যা কনসোল থেকে পূর্ণসংখ্যা পড়ে এবং একটি চ্যানেলের মাধ্যমে একটি গো-রুটিনে পাঠায়। গো-রুটিন কনসোলে প্রতিটি পূর্ণসংখ্যার বর্গ প্রিন্ট করে।
3. একটি প্রোগ্রাম লিখুন যেখানে একটি ইন্টিজার Buffered চ্যানেল তৈরি করতে হবে, যার বাফার সাইজ হবে 5। প্রোগ্রামটি দুটি গো-রুটিন তৈরি করবে যা চ্যানেলে এবং চ্যানেল থেকে ক্রমাগত ইন্টিজার পাঠাবে এবং গ্রহণ করবে। সেন্ডার গো-রুটিনে 1 থেকে 10 পর্যন্ত পূর্ণসংখ্যা পাঠাতে হবে। যখন রিসিভার গো-রুটিন চ্যানেল থেকে রিসিভ করবে, তখন প্রতিটি সংখ্যা প্রিন্ট করবে।
4. এমন একটি প্রোগ্রাম তৈরি করতে হবে যা একইসময়ে ইন্টারনেট থেকে গো-রুটিন ব্যবহার করে একাধিক ফাইল ডাউনলোড করবে। নিশ্চিত করতে হবে যে প্রোগ্রামটি বন্ধ করার আগে সমস্ত ডাউনলোড সম্পূর্ণ হয়েছে। sync.WaitGroup প্যাকেজ ব্যবহার করে এটা করতে হবে। আপনি প্রতিটি ফাইল ডাউনলোডের জন্য একটি নতুন গো-রুটিন তৈরি করবেন এবং সক্রিয় গো-রুটিন সংখ্যার ট্র্যাক রাখতে একটি ওয়েটগ্রুপ ব্যবহার করবেন৷
5. আপনার কাজ হল প্রোগ্রামটি ইমপ্লিমেন্ট করা, নিশ্চিত করা যে অ্যাকাউন্টের Balance সর্বদা নির্ভুল থাকবে, এমনকি যখন একাধিক গো-রুটিন একই সাথে এটি অ্যাক্সেস করে। একটি ডেমো কোড দেয়া হল । sync.Mutex ব্যবহার করে এটা করে ফেলুন –
func (a *BankAccount) Deposit(amount int) {
a.balance += amount
fmt.Printf("Deposited %d, new balance is %d\n", amount, a.balance)
}
func (a *BankAccount) Withdraw(amount int) {
if a.balance >= amount {
a.balance -= amount
fmt.Printf("Withdrew %d, new balance is %d\n", amount, a.balance)
} else {
fmt.Printf("Not enough funds to withdraw %d, balance is %d\n", amount, a.balance)
}
}
func main() {
account := &BankAccount{balance: 0}
rand.Seed(time.Now().UnixNano())
for i := 0; i < 10; i++ {
go func() {
for j := 0; j < 10; j++ {
if rand.Intn(2) == 0 {
account.Deposit(rand.Intn(100))
} else {
account.Withdraw(rand.Intn(100))
}
}
}()
}
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Printf("Current balance is %d\n", account.balance)
}
}
6. একটি Go প্রোগ্রাম লিখুন যাতে ২ টি গো-রুটিন কল করা হবে। একটিতে ০ থেকে ১০০ পর্যন্ত জোড় সংখ্যা ও অন্যটিতে বিজোড় সংখ্যা, নির্দিষ্ট চ্যানেলে পাঠানো হবে। কন্ডিশনালের মাধ্যমে ০ থেকে ১০০ ক্রমানুসারে প্রিন্ট করতে হবে। ক্রম ঠিক রাখতে চ্যানেল ব্যবহার করতে হবে।
package main
func printEvenNumbers(ch chan int) {
for i := 0; i <= 100; i += 2 {
ch <- i
}
close(ch)
}
func printOddNumbers(ch chan int) {
for i := 1; i <= 100; i += 2 {
ch <- i
}
close(ch)
}
func main() {
evenCh := make(chan int)
oddCh := make(chan int)
// run both function as goroutines
// Use conditional to achieve the final goal
for {
}
}
7. গো-রুটিন এবং চ্যানেল ব্যবহার করে ১ থেকে n পর্যন্ত সংখ্যার বর্গের যোগফল বের করার একটি কোড লিখুন.
package main
import "fmt"
func SumOfSquares(c, quit chan int) {
// your code here
}
func main() {
mychannel := make(chan int)
quitchannel := make(chan int)
sum := 0
go func() {
for i := 0; i < 6; i++ {
sum += <-mychannel
}
fmt.Println(sum)
}()
SumOfSquares(mychannel, quitchannel)
}
8. একটি URL এর লিস্ট থাকবে। গো-রুটিন ব্যবহার করে প্রত্যেকটি URL এর ডাটা ডাউনলোড করতে হবে এবং একটি Struct অ্যারেতে ডাটাগুলো স্টোর করে রাখতে হবে। চ্যানেল ব্যবহার করে কাজটি ধারাবাহিক ভাবে করতে হবে।
package main
type DownloadedData struct {
URL string
Data []byte
}
func downloadURL(url string, ch chan DownloadedData)
func main() {
urls := []string{
"https://example.com",
"https://golang.org",
"https://google.com",
}
// Make channel
// Read all the URLs using goroutine
// Get & store the data
}
9. গো-রুটিন ব্যবহার করে [9,4,3,6,1,2,10,5,7,8] অ্যারেটি সর্টিং এর জন্য একটি কোড লিখুন।
10. গো-রুটিন এবং চ্যানেল ব্যবহার করে জোড় এবং বিজোড় সংখ্যা বের করার একটি কোড লিখুন।