🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

গো ইন্টারভিউ প্রশ্ন 2026: গোরুটিন, চ্যানেল, ইন্টারফেস এবং ত্রুটি

⏱️3 min read  ·  612 words

2026-এ গো (গোলাং) সাক্ষাত্কারের প্রশ্নগুলি কভার গোরুটিন, চ্যানেল, ইন্টারফেস, মেমরি ম্যানেজমেন্ট এবং প্রোডাকশন প্যাটার্ন। Go Google, Cloudflare, Docker, Kubernetes এবং বেশিরভাগ ক্লাউড-নেটিভ কোম্পানিতে ব্যবহার করা হয়। এই গাইডটি সবচেয়ে বেশি জিজ্ঞাসিত গো ইন্টারভিউ প্রশ্ন কভার করে।

কোর গো কনসেপ্ট

1. কি গোকে অন্যান্য ভাষার থেকে আলাদা করে তোলে?

  • গোরুটিন: লাইটওয়েট থ্রেড (2KB স্ট্যাক বনাম 1MB OS থ্রেড)
  • চ্যানেল: প্রথম-শ্রেণীর যোগাযোগের আদিম (“মেমরি ভাগ করে যোগাযোগ করবেন না; যোগাযোগের মাধ্যমে মেমরি ভাগ করুন”)
  • দ্রুত সংকলন: সেকেন্ডের মধ্যে কম্পাইল
  • একক বাইনারি: স্ট্যাটিক্যালি লিঙ্ক, কোনো রানটাইম নির্ভরতা নেই
  • আবর্জনা সংগ্রহ করা হয়েছে: কিন্তু খুব কম জিসি বিরাম দিয়ে
  • উত্তরাধিকার নেই: এম্বেডিং এবং ইন্টারফেসের মাধ্যমে রচনা

2. গোরুটিন বনাম ওএস থ্রেড ব্যাখ্যা করুন

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	// OS threads: ~1MB stack, managed by OS
	// Goroutines: ~2KB stack (grows as needed), managed by Go runtime

	// Can run millions of goroutines on a few OS threads
	runtime.GOMAXPROCS(runtime.NumCPU())  // use all CPU cores

	var wg sync.WaitGroup
	for i := 0; i < 1_000_000; i++ {  // 1 million goroutines!
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			// Each goroutine does minimal work
		}(i)
	}
	wg.Wait()
	fmt.Println("Done")
}

3. বাফার এবং আনবাফার চ্যানেলের মধ্যে পার্থক্য কি?

// Unbuffered: sender blocks until receiver ready
ch := make(chan int)
go func() { ch <- 42 }()  // blocks until receive
val := <-ch

// Buffered: sender blocks only when buffer full
buffered := make(chan int, 5)
buffered <- 1  // doesn't block (buffer has space)
buffered <- 2
buffered <- 3
// buffered <- ... (6th send would block)

// Use buffered for:
// - Known number of items to send
// - Decoupling sender/receiver speeds
// - Preventing goroutine leaks in producer patterns

// Use unbuffered for:
// - Guaranteed synchronization
// - Signaling (done channels)

4. আপনি কিভাবে goroutine ফাঁস এড়াতে পারেন?

// LEAK: goroutine blocks forever on channel
func badWorker() {
	ch := make(chan int)
	go func() {
		// This goroutine will block forever if no one sends to ch!
		val := <-ch
		process(val)
	}()
	// ch goes out of scope, goroutine is stuck
}

// FIX: use context for cancellation
func goodWorker(ctx context.Context) {
	ch := make(chan int, 1)
	go func() {
		select {
		case val := <-ch:
			process(val)
		case <-ctx.Done():  // cancelled — exit cleanly
			return
		}
	}()
}

// Always ensure goroutines have a way to exit
// Rules:
// 1. Goroutine started → must have guaranteed exit path
// 2. Use context.Context for cancellation
// 3. Use done channels for signaling completion
// 4. goleak package in tests catches leaks

5. গো ইন্টারফেস ব্যাখ্যা করুন

// Interface: implicit implementation (no "implements" keyword)
type Writer interface {
	Write(data []byte) (n int, err error)
}

// Any type with Write method satisfies Writer
type FileWriter struct{ path string }
func (f *FileWriter) Write(data []byte) (int, error) {
	// write to file
	return len(data), nil
}

type NetworkWriter struct{ conn net.Conn }
func (n *NetworkWriter) Write(data []byte) (int, error) {
	return n.conn.Write(data)
}

// Function works with any Writer
func sendData(w Writer, data []byte) error {
	_, err := w.Write(data)
	return err
}

// Empty interface (any type)
var anything interface{} = 42
anything = "now a string"
anything = struct{ x int }{x: 1}

// Type assertion
str, ok := anything.(string)
if ok { fmt.Println(str) }

// Type switch
switch v := anything.(type) {
case int:   fmt.Println("int:", v)
case string: fmt.Println("string:", v)
default:    fmt.Printf("unknown: %T
", v)
}

6. ডিফার, প্যানিক এবং পুনরুদ্ধার কি?

// defer: runs at function exit (LIFO order)
func readFile(path string) ([]byte, error) {
	f, err := os.Open(path)
	if err != nil { return nil, err }
	defer f.Close()  // always closes, even on error/panic
	return io.ReadAll(f)
}

// panic: unrecoverable error (like exception)
// recover: catch panic in deferred function
func safeDiv(a, b int) (result int, err error) {
	defer func() {
		if r := recover(); r != nil {
			err = fmt.Errorf("recovered from panic: %v", r)
		}
	}()
	return a / b, nil  // panics if b == 0
}

result, err := safeDiv(10, 0)
// err = "recovered from panic: runtime error: integer divide by zero"

// Rule: use panic only for truly unrecoverable errors
// Use errors for expected error cases

7. Go কীভাবে ত্রুটিগুলি পরিচালনা করে?

// Go errors are values, not exceptions
func divide(a, b float64) (float64, error) {
	if b == 0 {
		return 0, fmt.Errorf("cannot divide by zero")
	}
	return a / b, nil
}

// Always check errors
result, err := divide(10, 0)
if err != nil {
	log.Printf("error: %v", err)
	return err
}

// Custom errors
type ValidationError struct {
	Field   string
	Message string
}

func (e *ValidationError) Error() string {
	return fmt.Sprintf("validation error on %s: %s", e.Field, e.Message)
}

// Error wrapping (Go 1.13+)
if err != nil {
	return fmt.Errorf("processing user %d: %w", userID, err)  // %w wraps
}

// Unwrap
var valErr *ValidationError
if errors.As(err, &valErr) {
	fmt.Println("Field:", valErr.Field)
}

সাক্ষাত্কারে সফল হন: গোরুটিন এবং চ্যানেলগুলিকে গভীরভাবে বুঝুন (অন্যান্য ভাষা থেকে মূল পার্থক্যকারী), কখন বাফার বনাম আনবাফার করা চ্যানেলগুলি ব্যবহার করতে হবে তা জানুন, ইন্টারফেসের সন্তুষ্টি স্পষ্টভাবে ব্যাখ্যা করুন এবং মোড়ানোর সাথে পরিষ্কার ত্রুটি পরিচালনা প্রদর্শন করুন। সিনিয়র গো রোলগুলি কনকারেন্সি প্যাটার্ন, pprof-এর সাথে পারফরম্যান্স প্রোফাইলিং এবং প্রোডাকশন ডিপ্লোয়মেন্টও পরীক্ষা করে।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা