1. গো মডিউল এবং প্যাকেজ ম্যানেজমেন্ট মৌলিক জ্ঞান

গো মডিউল হল গো ভাষার সরকারী প্যাকেজ ম্যানেজমেন্ট এবং ডিপেন্ডেন্সি সংস্করণ নিয়ন্ত্রণ সিস্টেম, যা গো 1.11 থেকে প্রস্তুত হয়েছিল এবং গো 1.13 থেকে পরে গো 1.13-এ ডিফল্ট ডিপেন্ডেন্সি ম্যানেজমেন্ট ব্যবস্থা হিসেবে আসছে। গো মডিউল প্রতিটি প্রকল্পকে একটি মডিউল হিসাবে পরিচালনা করে, যা প্রকল্পের গো কোড এবং সেই প্যাকেজের সব ডিপেন্ডেন্সিগুলি অন্তর্ভুক্ত থাকে।

কাজের নীতি

গো মডিউল প্রকল্পের ডিপেন্ডেন্সিগুলি একটি go.mod ফাইল দ্বারা ব্যবস্থাপনা করে। এই ফাইলটি প্রকল্পের মূল ডিরেক্টরিতে অবস্থিত এবং সব নির্দেশিত ডিপেন্ডেন্সি এবং তাদের সংস্করণগুলি তালিকা করে। একটি মডিউল একাধিক প্যাকেজ অন্তর্ভুক্ত করতে পারে, তবে সাধারণত একটি রিপোজিটরি একটি মডিউল।

প্রওয়াইতেই ডিপেন্ডেন্সি ইনফরমেশন ফেচ এবং প্যাকেজ তৈরি করার জন্য, যদি বর্তমান ডিরেক্টরিতে go.mod ফাইল না থাকে, তবে গো টুলচেন বর্তমান সংদর্ভের মডিউল সন্দর্ভে জানার জন্য বর্তমান ডিরেক্টরি এবং এর প্যারেন্ট ডিরেক্টরিগুলিতে go.mod খুঁজে বের করবে। যদি পাওয়া যায়, তবে সেই ফাইলে ডিপেন্ডেন্সি তথ্যগুলি ব্যবহার করে প্যাকেজ তৈরি করবে; অন্যথায়, তা জি‌ওপি‌অথ মোড অধীনে ডিপেন্ডেন্সি ম্যানেজমেন্ট পদ্ধতিতে ব্যবহার করবে।

গো ভাষায় ভূমিকা

  • সংস্করণ নিয়ন্ত্রণ: গো মডিউল ডেভেলপারদের অনুমোদিত সুত্রের সংস্করণ নির্দেশ করা দেয় এবং কোড পুনরুত্পাদনযোগ্যতা নিশ্চিত করে।
  • প্যাকেজ ম্যানেজমেন্ট: প্রকল্পের ডিপেন্ডেন্সি এবং তাদের সংস্করণ সুবিধাজনকভাবে পরিচালনা করা।
  • মডিউল আইসোলেশন: বিভিন্ন প্রকল্প নিয়ে সংধান বিপরীত সংস্করণের একই প্যাকেজের উপর নির্ভর করতে পারে, যা প্রতি প্রকল্পের নিজস্ব go.mod ফাইল দিয়ে ডিপেন্ডেন্সিগুলি ব্যবস্থাপনা করে।

প্যাকেজ এবং মডিউল ম্যানেজমেন্ট কোনও আধুনিক প্রোগ্রামিং ভাষার জন্য গুরুত্বপূর্ণ বিষয় হিসেবে বিবেচনা করা হয়, কোনও অবশিষ্ট বিষয় যেমন ডিপেন্ডেন্সি ম্যানেজমেন্ট, প্যাকেজের সংস্করণ আপগ্রেড, এবং নিচেনের প্যাকেজ ব্যবহারকারীদের জন্য পুনরাবৃত্তি বিছানার জন্য সুসাঙ্গি তৈরী করা সহ, অনুদান ইতিকে উপাত্ত ইসান্য করে। গো ভাষায়, যেমন প্রকল্প এবং ডিপেন্ডেন্সি গুণসম্পন্ন থাকা চলকদের বধানে, গো মডিউল চিন্তা একটি প্রয়োজন জৈবনিকভাবে উত্তরণ ম্যানেজমেন্ট চ্যালেঞ্জ সমাধানোর জন্য বাধ্যতামূলক প্রয়োজন।

2. আপনার নিজের গো মডিউল আরম্ভ করা

নতুন গো মডিউলটি খুব সহজে আরম্ভ করা যায়। আপনি আপনার প্রকল্পের মূল ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি ব্যাবহার করতে পারেন:

go mod init <module-name>

এখানে <module-name> সাধারণত কোড রিপোজিটরির ঠিকানা, যেমন github.com/username/repo এর মত।

go.mod ফাইলের উদ্দেশ্য

যেকোন কারণেই go mod init কমান্ডটি সফলভাবে ক্রিয়াশীল হলে, বর্তমান ডিরেক্টরিতে একটি go.mod ফাইল তৈরি হবে। এই ফাইলটি নিম্নোক্ত সম্পর্কিত তথ্য নির্দেশ করে:

  • বর্তমান মডিউলের নাম।
  • গো সংস্করণ।
  • প্রত্যাবর্তনযোগ্য প্যাকেজ সহ সকল সরাসরি ডিপেন্ডেন্সির প্রয়োজনীয় তথ্য, যেমন প্রতিটি প্যাকেজের উপযোগী সংস্করণ।

go.mod ফাইলটি গো মডিউল ব্যবস্থার সবচেয়ে গুরুত্বপূর্ণ উপাদান এবং এখানে ডিপেন্ডেন্সিগুলি সংযুক্ত অথবা অপসারণ হওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে আপডেট হবে।

3. গো প্যাকেজ তৈরি এবং সাজানো

3.1 প্যাকেজ তৈরির মৌলিক জ্ঞান

গো ভাষায়, একটি প্যাকেজ হল একাধিক গো সোর্স ফাইলের সংগ্রহ, যা সাধারণত একই ডিরেক্টরিতে অবস্থিত এবং এটি একটি নির্দিষ্ট সেট ফাংশনালিটিগুলি ধারণ করে। package কীওয়ার্ডটি ব্যবহার করে প্রতিটি গো ফাইল উদ্বুদ্ধ করে যে প্যাকেজে এটি উপস্থিত।

একটি নতুন প্যাকেজ তৈরি করতে, আপনাকে নিম্নলিখিত করতে হবে:

  1. প্যাকেজের ডিরেক্টরি প্রতিনিধিত্ব করার জন্য একটি ফোল্ডার তৈরি করুন।
  2. ফোল্ডারে .go ফাইল তৈরি করুন এবং ফাইলের প্রথম লাইনে package <package-name> নির্দেশ করুন।

প্যাকেজের নামটি সাধারণত ডিরেক্টরির নামের সাথে সম্পর্কিত হয়, তাছাড়া এটি পাঠাগুলি বাদ দেওয়ার জন্য চিহ্নিত করা সুনিশ্চিত করা উচিত।

3.2 প্যাকেজের সাজানো

আপনার গো প্যাকেজগুলি লজিকাল উপায়ে সাজিয়ে রাখা গুরুত্বপূর্ণ, যাতে কোডের পঠনযোগ্যতা, রক

4.1 আন্তরিক প্যাকেজ আমদানি

ধরা যাক আপনার প্রকল্পের প্রকার নিম্নরূপ:

├── src
│   ├── main.go
│   └── mypackage
│       └── mymodule.go

এই উদাহরণে, mypackage হল একটি আন্তরিক প্যাকেজ যা আপনি তৈরি করেছেন, যা mymodule.go নামের ফাইল ধারণ করে। প্রথমে, নিশ্চিত করুন যে mymodule.go ফাইলটি সঠিক প্যাকেজের নাম ঘোষণা করে:

// mymodule.go
package mypackage

// SomeFunction হল `mypackage` প্যাকেজের একটি পাবলিক ফাংশন
func SomeFunction() {
    // ফাংশন সম্পাদনা
}

এখন, যদি আমরা main.go ফাইলে mypackage প্যাকেজ থেকে SomeFunction ব্যবহার করতে চাই, তবে আমাদের এটি আমদানি করতে হবে:

// main.go
package main

import (
    "fmt"
    "project/src/mypackage"
)

func main() {
    mypackage.SomeFunction()
    fmt.Println("ফাংশনটি কল করা হয়েছে")
}

উপরের import স্টেটমেন্ট mypackage প্যাকেজটি আমাদের main.go ফাইলে আমদানি করে, যাতে আমরা এই প্যাকেজ থেকে ফাংশনগুলি ব্যবহার করতে পারি mypackage.SomeFunction ব্যবহার করে।

4.2 বাহ্যিক প্যাকেজ ব্যবহার

এক্দম অল্পনা ফাংশনালিটি বাহ্যিক প্যাকেজ ব্যবহার করতে হলে, আমরা সাধারণভাবে অন্যেরা প্রদান করা অনুপ্রয়োগ্য প্যাকেজ নির্ভর করি। বাহ্যিক প্যাকেজগুলি অন্যরা লেখা এবং সার্বজনীন উपলব্ধ যা আমরা সহজে আমাদের নিজের প্রকল্পে সম্মিলিত করতে পারি। বাহ্যিক প্যাকেজ খুঁজুন, আপনি ওয়েবসাইট যেমন godoc.org ভিজিট করতে পারেন অথবা GitHub এ অনুসন্ধান করতে পারেন।

ধরা যাক আপনি আপনার প্রকল্পে gorilla/mux ব্যবহার করতে চান, যা একটি জনপ্রিয় HTTP রিকোয়েস্ট রাউটার লাইব্রেরি। আপনি তাকে নিম্নলিখিত ভাবে আমদানি করতে ও ব্যবহার করতে পারবেন:

প্রথমে, go get কমান্ড ব্যবহার করে প্যাকেজটি ইনস্টল করুন:

go get -u github.com/gorilla/mux

তারপর, আমদানি করুন এবং আপনার কোডে gorilla/mux ব্যবহার করুন:

package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter() // একটি রাউটার ইনস্ট্যান্স তৈরি করুন
    // রুট নিয়ম যোগ করুন
    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        w.Write([]byte("গরিলা/মাক্সে আপনাকে স্বাগতম!"))
    })
    
    // HTTP সার্ভার শুরু করুন
    http.ListenAndServe(":8000", r)
}

উপরের কোডে, আমরা gorilla/mux আমদানি করে একটি HTTP রাউটার তৈরি করতে, মৌলিক পথের জন্য একটি হ্যান্ডলার ফাংশন পরিভাষা করি, এবং শেষে http.ListenAndServe ব্যবহার করে 8000 নম্বর পোর্টে সার্ভার চালু করি।

5. মডিউল নির্ভরতা পরিচালনা

বড় পরিস্কার প্রকল্পে, মডিউল নির্ভরতা পরিচালনা বিশেষভাবে গুরুত্বপূর্ণ হয়। এটা নিশ্চিত করে যে প্রতিটি বিল্ড বা প্রকল্প লোপের জন্য একই সংস্করণের নির্ভরতা ব্যবহার করা যায়।

5.1 মডিউলের নির্ভরতা আপডেট করা go get দিয়ে

go get কমান্ড নতুন প্যাকেজের নির্ভরতা যোগ করা না করে পুরাণো প্যাকেজ নির্ভরতা আপডেট করতে পারে। নীচে কিছু সাধারণ go get এর বিকল্প রয়েছে:

  • একক প্যাকেজ আপডেট করুন:
  go get -u github.com/some/package
  • এই প্যাকেজের সমস্ত নির্ভরতা আপডেট করুন:
  go get -u github.com/some/package/...
  • প্রকল্পের সমস্ত নির্ভরতা আপডেট করুন:
  go get -u ./...
  • ডাউনলোড করুন তবে ইনস্টল না করুন:
  go get -d github.com/some/package

আপডেট অপারেশন সম্পাদনা করার সময়, Go নির্ভরতা গুলি নতুনতম মাইন বা পরিষ্করণ সংস্করণে আপডেট করবে, এবং পরিবর্তনগুলি ওয়া গুলি .go.mod ফাইলে প্রতিফলন করা হবে।

5.2 ভার্সন নিয়ন্ত্রণ এবং go.mod

ভার্সন 1.11 থেকে, গো দিয়ে Go Modules নামক একটি নতুন নির্ভরতা ব্যবস্থা প্রদান করা হয়েছে। প্রকল্পের মূল নির্দেশিকায়, go.mod ফাইলে প্যাকেজগুলির নির্ভরণগুলি নির্ধারণ করে।

go.mod ফাইলে নিম্নলিখিত অনুচ্ছেদ রয়েছে:

  • মডিউল বর্তমান প্রকল্পের মডিউল পাথ ঘোষণা করে।
  • এক্সাইজিট নির্ভরণগুলি এবং তাদের নির্দিষ্ট সংস্করণগুলি ঘোষণা করে।
  • রিপ্লেস নির্দিষ্ট মডিউল পাথ এবং সংস্করণগুলি নির্ধারণ করতে পারে।
  • এক্সক্লুড নির্দিষ্ট সংস্করণগুলি বাদ দেওয়ার জন্য ব্যবহৃত হয়।

go.mod ফাইলের একটি উদাহরণ এমন হতে পারে:

module github.com/my/awesome-project

go 1.14

require (
    github.com/gorilla/mux v1.7.4
    golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975
)

replace (
    github.com/old/dependency => github.com/new/dependency v1.2.3
)

exclude (
    github.com/old/dependency v1.1.4
)

প্রকল্পে go build বা go test ইত্যাদি প্রকল্পে কমান্ড চালিয়ে যা করা হয়, গো, স্বয়ংক্রিয়ভাবে প্রয়োজনীয় সব নির্ভরণগুলি তার জন্য ঘোষণা করতে অথবা নতুন করে তৈরি বা আপডেট করতে go.mod ফাইল। সংস্করণ নিয়ন্ত্রণে সেরা অনুশাসন করার জন্য, ব্যবহারিকতা রক্ষা করার জন্য প্রস্তাবিত হ্যাশের ক্রিপ্টোগ্রাফিক হ্যাশ রেকর্ড করা go.mod এবং go.sum (যা প্রয়োজনীয় ক্রিপ্টোগ্রাফিক হ্যাশ ঘোষণা করে) ফাইলগুলি নির্ধারণ করা।

go.mod ফাইল দ্বারা ব্যবস্থা করার মাধ্যমে, এটা নিশ্চিত করে যে প্রত্যেক ডেভেলপার দলের সব নির্ভরণ সংস্করণ ব্যবহার করে, তাই "তাই আমার মেশিনে কাজ করে" অফিসের অসুবিধা এড়ানো হয়না।