Installing Multiple Version of Golang using GoEnv

Often we need a different version of go according to specific projects. There are different options we have like we can use Docker for our specific project’s need(we can talk about that in a different blog post). There are several other options but in this blog, we will talk about goenv.

Prerequisites: git

We’re using Ubuntu 20.04 so below instruction will work in ubuntu. On Mac too. Not sure about windows.

Official Installation Guide GOENV Install guide

Goto github

git clone https://github.com/syndbg/goenv.git ~/.goenv

if this particular git code syntax you(readers) are not familiar with we will explain it, it just cloning the repo and place it on .goenv folder on the home// directory.

Define environment variable GOENV_ROOT

echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bashrc
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bashrc

for zsh/oh-my-zsh users, use zshrc or respective config files according to your terminal settings.

Add goenv init to your shell

echo 'eval "$(goenv init -)"' >> ~/.bashrc

If you want goenv to manage GOPATH and GOROOT (recommended), add GOPATH and GOROOT to your shell after eval "$(goenv init -)"

echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.bashrc

echo 'export GOPATH="$HOME/<workspaces_path>/go"' >> ~/.bashrc

GOPATH Folder Structure
gopath_folder_structure

Restart your shell so the path changes take effect.

exec $SHELL

Install Go versions into $GOENV_ROOT/versions

goenv install <version_number>

# check all version which can be installed
goenv install -l

# Example
goenv install 1.15.6

To upgrade to a specific release of goenv

cd $(goenv root)
git pull

Uninstalling goenv

rm -rf goenv root

Disable goenv

To disable goenv managing your Go versions, simply remove the goenv init line from your shell startup configuration. This will remove goenv shims directory from PATH, and future invocations like goenv will execute the system Go version, as before goenv.

Uninstalling Go Versions

goenv uninstall

Run this command after you install a new version of Go to activate

goenv rehash

If you like you can read the same article in my personal github gist

How to use a specified version of Go (Globally or Locally)

# global
goenv global 1.15.6

# Local
goenv local 1.15.6

জাভাস্ক্রিপ্টে Hoisting কি?

আমার শেষ লেখায় জাভাস্ক্রিটের Execution Context এবং Scope নিয়ে লিখেছিলাম। আজকে আলোচনা করবো জাভাস্ক্রিপ্টের আরেকটি মহা গুরুত্বপূর্ণ বিষয় Hoisting নিয়ে। এটি একটি খুবই সহজ বিষয় হলেও অনেকের কাছে খুবই কঠিন এবং যখন প্রথমবার এটির সাথে পরিচয় হয় তখন অনেকের ঘুম হারামের কারণও হয়ে দাড়ায়। যাইহোক, আমি চেষ্টা করবো যতটা সহজভাবে আলোচনা করা যায়। এই লেখাটি পড়ার আগে আমার Execution Context এবং Scope নিয়ে লেখা দুটি আর্টিকেল পড়ে আসতে বলবো। তাহলে Hoisting বুঝতে আপনার জন্যে অনেক সহজ হয়ে যাবে।

১। Execution Context

২। Scope

Hoisting কি?

Hoisting হচ্ছে জাভাস্ক্রিপ্ট এমন একটি পদ্ধতি যেখানে কোড এক্সিকিউশন করার আগে ভ্যারিয়েবল এবং ফাংশন ডিক্লেয়ারেশনগুলোকে তার বর্তমান Scope – এর শুরুতে নিয়ে যায়।

উদাহরণস্বরূপঃ

    function hoisting() {
     console.log(message);
     var message='Hi there, We are learning Hoisting!'
    }

hoisting(); // Ouput: undefined

উদাহরণের ব্যাখ্যা দেওয়ার আগে Hoisting সম্পর্কে কিছু কথা বলে নেই। যখন আমরা কাউকে Hoisting বুঝায় উপরের সংজ্ঞাটা দিয়েই বুঝায়। কিন্তু আসলেই কি জাভাস্ক্রিপ্ট তার সকল ভ্যারিয়েবলস এবং ফাংশন ডিক্লেয়ারেশনগুলোকে তার স্কোপের উপরে নিয়ে যায়? না, জাভাস্ক্রিপ্ট এমনটা কখনো করে না। যদি আপনি আমার Execution Context নিয়ে লেখাটা পড়ে থাকেন, তাহলে আপনি জানেন যে যখন আপনি জাভাস্ক্রিপ্টের কোন কোড এক্সিকিউট করেন, জাভাস্ক্রিপ্ট ইঞ্জিন গ্লোবাল এক্সিকিউশন কন্টেক্সট তৈরি করে।

গ্লোবাল এক্সিকিউশন কন্টেক্সট এর দুটি phase আছে: creation এবং execution। creation phase চলার সময়, জাভাস্ক্রিপ্ট ইঞ্জিন সকল ভ্যারিয়েবলকে undefined হিসাবে ইনিশিয়ালাইজ করে। এবার চলুন আমরা Hoisting-এ ফিরে যাই।

জাভাস্ক্রিপ্টে Hoisting হচ্ছে দুই প্রকার। ১. Variable Hoisting এবং ২. Function Hoisting

১. Variable Hoisting

    console.log(hoistingIntro); // Outpur: undefined

    var hoistingIntro = "Hi there, I am a string one.";

উপরের console.log এর আউটপুট কি হবে? একটু চিন্তা করুন সময় নিয়ে। যাইহোক, উপরের কোডে কোন ভুল নেই। কারণ আমরা জানি জাভাস্ক্রিপ্ট ইঞ্জিন Creation phase-এ ভ্যারিয়েবল ডিক্লেয়ারেশনকে undefined হিসাবে ইনিশিয়ালাইজ করে। তাই, Execution phase-এ আউটপুট undefined হচ্ছে কারণ আমরা তার ভ্যালু ইনিশিয়ালাইজ হওয়ার আগেই log করে ফেলেছি। টেকনিক্যালি, কোডটি Execution phase-এ নিম্নলিখিত কোডের মত দেখাবেঃ

    var hoistingIntro = undefined;

    console.log(hoistingIntro); // output: undefined
    hoistingIntro = "Hi there, I am a string one.";

২। Functions Hoisting

ভ্যারিয়েবলের মত ফাংশনও Hoisted হয়। তাই আপনি আগে ফাংশন কল করে পরে ফাংশন ডিক্লেয়ার করতে পারবেন।

    hoistedFunc(); // Hoisted

    function hoistedFunc() {
        console.log("Hoisted.");
    }

বিঃ দ্রঃ একটি কথা ভাল করে মনে রাখবেন যে জাভাস্ক্রিপ্ট ফানশন এক্সপ্রেশনের ক্ষেত্রে কোন Hoisting করে না।

    hoistedFunEx(); // TypeError: hoistedFunEx is not a function

     var hoistedFunEx = function() {
      console.log("Hoisted.");
    }

আপনাদের জন্যে একটি হোম টাস্ক। নিচের কোডের দুইটা console.log এর আউটপুট কি হবে? চাইলে কমেন্ট করে জানাতে পারেন। 🙂

var hoistingIntro = "Hi there, I am a string one.";

function hoistingFunc() {
  console.log(hoistingIntro);
  var hoistingIntro = "Hi there, I am a string two";
  console.log(hoistingIntro);
}

hoistingFunc();

আজকের জন্যে বিদায় নিচ্ছি পরবর্তী লেখা পড়ার আমন্ত্রণ জানিয়ে। যদি কোন প্রশ্ন বা মতামত থাকে তাহলে অবশ্যই জানাবেন।

জাভাস্ক্রিপ্টে স্কোপ কি?

জাভাস্ক্রিপ্টের আলোচিত বিষয়গুলোর মাঝে একটি হল Scope। আপনি যদি একজন নতুন জাভাস্ক্রিপ্ট প্রোগ্রামার হয়ে থাকেন তাহলে এটির সাথে ভাল করে পরিচয় হওয়া অতি প্রয়োজন। তাই আজকে scope নিয়ে মনের কিছু কথা বলতে চাচ্ছি। 😛

Scope কি?

Scope মূলত একটা নির্দিষ্ট সীমানাকে বোঝায়। যার বাহিরে Variable এবং Function-গুলো এক্সেসিবল না। যদি এই সীমানার বাহিরে কোন Variable এবং Function কে কল করা হয় তাহলে তার কোন অস্তিত্ব থাকবে না। একটি কথা ভাল করে মাথায় সংরক্ষণ করে রাখেন যে, জাভাস্ক্রিপ্টে একমাত্র তখনই Scope তৈরি হয়, যখন আমরা কোন function ইনভোক বা কাল করি। হ্যাঁ, function ছাড়া আর কোথাও Scope তৈরি হয় না। আর এই Scope হচ্ছে দুই প্রকার- ১. Global Scope এবং ২. Local Scope

১. Global Scope

জাভাস্ক্রিপ্টে বাই ডিফল্ট সব কিছু Global Scope – এ রান হয়ে। যার এক্সেসিবল সব জায়গায় থাকে। উদাহরণস্বরূপ-

var globalVariable = "I am global variable.";
console.log(globalVariable); // I am global variable.

var myFunc = function() {
    console.log(globalVariable);
}

myFunc() // I am global variable.

উপরের কোডটুকু রান করলে দেখতে পারবেন যে globalVariable নামের ভেরিয়েবলটিকে সব যায়গায় ব্যবহার করা যাচ্ছে এবং সবার আউটপুটও একই দেখাচ্ছে।

২. Local Scope

আগেই বলেছিলাম যে, জাভাস্ক্রিপ্ট একমাত্র Scope তৈরি করে কোন Function ইনভোক বা কাল করলে। এই Scope কেই বলা হয় Local Scope। মানে হচ্ছে, তার ভিতরে যা কিছু থাকবে তার নিজস্ব Scope – এর বাহিরে এর কোন অস্তিত্ব থাকবে না। অর্থাৎ, তার Scope – এর ভিতরে লিখা কোন ভেরিয়েবলকে যদি আমরা বাহিরে অন্য কোথাও ব্যবহার করতে চাই তাহলে জাভাস্ক্রিপ্ট খুব সুন্দর করে একটি আনকট রেফারেন্সে ইরর দিয়ে বলে দিবে যে খোকা তুমি যাকে ব্যবহার করতে চাচ্ছ সে তো কোথাও ডেফাইন করা নেই। চলুন একটা উদাহরণ দিয়ে দেখা যাক-

var globalVariable = "I am global variable.";

var myFunc = function() {
    var localVariable = "I am local variable.";

    console.log(globalVariable);
    console.log(localVariable);
}

myFunc();
// I am global variable.
// I am local variable.

console.log(localVariable); // udefined

উপরের কোডটুকু রান করলে দেখতে পারবেন যে প্রথমে দেখাচ্ছে I am global variable. এবং I am local variable. তারপর অতি ভদ্রতার সাথে খুব সুন্দর করে বলে দিছে যে আনকট রেফারেন্সেঃ লোকাল ইজ নট ডিফাইন্ড।

Lexical Scoping কি?

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

function outerFunc(a) {
     var outerFuncVariable = "Hi there, I am outer " + a;

     console.log(outerFuncVariable); // Hi there, I am inner function variable

     function innerFunc() {
         var innerFuncVariable = "Hi there, I am inner " + a;
         console.log(innerFuncVariable);
     }

     innerFunc(); // Hi there, I am inner function variable

     console.log(innerFuncVariable); // undefined
 }

 outerFunc("function variable");

নোটসঃ

  • জাভাস্ক্রিপ্টের গ্লোবাল স্কোপ এবং লোকা স্কোপ আছে।
  • যে কোন ফাংশনের বাইরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যরিয়েবলগুলো গ্লোবাল ভ্যারিয়েবল হয়ে যায়।
  • ফাংশনে ভিতরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যারিয়েবলগুলো সেই ফাংশনের লোকাল ভ্যারিয়েবল হয়।
  • যে কোন ফাংশনের ভেতরে ভ্যারিয়েবল কীওয়ার্ড ছাড়া ডিক্লেয়ারড ভ্যারিয়েবলগুলো স্বয়ংক্রিয়ভাবে গ্লোবাল ভ্যারিয়েবল হয়ে যায়।
  • গ্লোবাল ভ্যারিয়েবলগুলো প্রোগ্রামের যেকোন জায়গায় অ্যাক্সেস এবং পরিবর্তন করা যেতে পারে।
  • ফাংশন ডিক্লেয়ারেশনের বাইরে লোকাল ভ্যারিয়েবল সমূহ অ্যাক্সেস করা যাবে না।
  • গ্লোবাল ভ্যারিয়েবল এবং লোকাল ভ্যারিয়েবল একই নাম থাকতে পারে। কিন্তু একই নাম ব্যবহার না করায় ভাল।

আশা করি, এখন Scope কি এবং Lexical Scoping কি কিছুটা হলেও বুঝতে পারছেন। আজ এই পর্যন্তই পরবর্তীতে অন্য কোন টপিক নিয়ে আবার হাজির হবো ইনশাআল্লাহ্‌। ততক্ষণ পর্যন্ত সবাই ভাল থাকুন। আল্লাহ্‌ হাফেজ।

জাভাস্ক্রিপ্টে এক্সিকিউশন কনটেক্স কি?

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

আজকের এই পোস্টে শিখবো, জাভাস্ক্রিপ্টে এক্সিকিউশন কনটেক্স কি। তাহলে বেশি কথা না বলে চলুন শুরু করে দেই আমাদের আজকের মিশন।

এক্সিকিউশন কন্টেক্স কি?

এক্সিকিউশন কন্টেক্স একটি এনভাইরনমেন্ট যেখানে জাভাস্ক্রিপ্ট কোড এক্সিকিউট করা হয়। যখনই জাভাস্ক্রিপ্টে কোন কোড রান করা হয়, এটি একটি এক্সিকিউশন কন্টেক্সের মধ্যে রান করা হয়।

জাভাস্ক্রিপ্টে তিন ধরনের এক্সিকিউশন কন্টেক্স আছেঃ-

  • গ্লোবাল এক্সিকিউশন কন্টেক্স – এটি ডিফল্ট এক্সিকিউশন কন্টেক্স। যে কোডটি কোন ফাংশনের ভিতরে নেই তা গ্লোবাল এক্সিকিউশন কন্টেক্সে আছে। এটি দুটি জিনিস সম্পন্ন করেঃ
    ১। এটি একটি গ্লোবাল অবজেক্ট তৈরি করে যা একটি window অবজেক্ট (ব্রাউজারের ক্ষেত্রে) এবং global অবজেক্ট (নোডের ক্ষেত্রে)
    ২। this এর ভ্যালু হিসাবে গ্লোবাল অবজেক্টকে সেট করে। একটি প্রোগ্রামে শুধুমাত্র একটি গ্লোবাল এক্সিকিউশন কন্টেক্স থাকতে পারে।

  • ফাংশন এক্সিকিউশন কন্টেক্স – যখনই কোন ফাংশন কল করা হয়, সেই ফাংশনের জন্য জেএস ইঞ্জিন একটি নতুন এক্সিকিউশন কন্টেক্স তৈরি করে। প্রতিটি ফাংশনের নিজস্ব এক্সিকিউশন কন্টেক্স আছে। একাধিক সংখ্যক ফাংশন এক্সিকিউশন কন্টেক্স হতে পারে। ফাংশন এক্সিকিউশন কন্টেক্সের গ্লোবাল এক্সিকিউশন কন্টেক্সের সকল কোড অ্যাক্সেস আছে যদিও গ্লোবাল কন্টেক্সের ফাংশন এক্সিকিউশন কন্টেক্সের কোডের অ্যাক্সেস নেই। গ্লোবাল এক্সিকিউশন কন্টেক্সের কোড এক্সিকিউট করার সময় যদি জেএস ইঞ্জিন কোন ফাংশন কল পায়, এটি সেই ফাংশনের জন্য একটি নতুন ফাংশন এক্সিকিউশন কন্টেক্সত তৈরি করে। ব্রাউজার কন্টেক্সে, যদি কোড strict মোডে এক্সিকিউট করা হয়, তাহলে this এর ভ্যালু undefined অন্যথায় window অবজেক্ট হবে ফাংশন এক্সিকিউশন কন্টেক্সে।

  • ইভাল এক্সিকিউশন কন্টেক্স – ইভাল ফাংশনের ভিতরে এক্সিকিউশন কন্টেক্স।

নিম্নলিখিত কোড দেখুনঃ

let a = 7;

const multByTen = a => a * 10;

let results = multByTen(a);

console.log(results); // 70

উপরের কোডে লক্ষ্য করুনঃ

  • প্রথমে, a ভ্যারিয়েবলে 7 অ্যাসাইন করা হয়েছে।
  • দ্বিতীয়ত, একটি ফাংশন multByTen() ডিক্লেয়ার করা হয়েছে যা 10 এর সাথে তার আর্গুমেন্ট কে গুণ করে।
  • তৃতীয়ত, একটি প্যারামিটার হিসাবে a পাস করে multByTen() ফাংশনকে কল করে এবং ভ্যারিয়েবল results – এ রিটার্ন মান অ্যাসাইন করা হয়েছে।
  • পরিশেষে, কনসোলে ভ্যারিয়েবল results আউটপুট করা হয়েছে।

অনেক সহজ কোডটা তাই না? যাইহোক, বিহাইন্ড দ্যা সিন জাভাস্ক্রিপ্ট অনেক কিছু করে। ইতিমধ্যে আমরা এক্সিকিউশন কন্টেক্স সম্পর্কে জেনে গেছি। কিন্তু প্রতিটি এক্সিকিউশন কন্টেক্সে দুটি করে phases আছেঃ ১। creation phase এবং ২। execution phase।

১। Creation phase

  • একটি গ্লোবাল অবজেক্ট তৈরি করে অর্থাৎ, ওয়েব ব্রাউজারে window বা নোড জেএসে global
  • একটি this অবজেক্ট বাইন্ডিং তৈরি করে যা উপরের গ্লোবাল অবজেক্টকে নির্দেশ করে।
  • ভ্যারিয়েবল এবং ফাংশন রেফারেন্স স্টোর করার জন্য একটি মেমোরি হীপ সেটআপ করে।
  • ভ্যারিয়েবলের ইনিশিয়াল ভ্যালু হিসাবে undefined গ্লোবাল এক্সিকিউশন কন্টেক্সে এবং ফাংশন ডিক্লেয়ারেশনগুলি মেমোরি হীপে স্টোর করে।

আমাদের উদাহরণে, creation phase – এ জাভাস্ক্রিপ্ট ইঞ্জিন গ্লোবাল এক্সিকিউশন কন্টেক্সে ভ্যারিয়েবল a ও results এবং ফাংশন ডিক্লেয়ারেশন multByTen() স্টোর করে। এছাড়াও, এটি ভ্যারিয়েবল a এবং results কে undefined হিসাবে ইনিশিয়ালাইজ করে।

Global Execution Context (Creaton Phase Browser)

  • window: Global Object
  • this: window
  • a: undefined
  • multByTen: fn()
  • results: undefined

Creation phase এর পর, গ্লোবাল এক্সিকিউশন কন্টেক্স execution phase শুরু করে।

Execution phase

Execution phase – এ, জাভাস্ক্রিপ্ট ইঞ্জিন লাইন বাই লাইন কোড এক্সিকিউট করে। এই phase -এ, এটি ভ্যারিয়েবলের মান অ্যাসাইন করে এবং ফাংশন কল এক্সিকিউট করে।

Global Execution Context (Execution Phase Browser)

  • window: Global Object
  • this: window
  • a: 7
  • multByTen: fn()
  • results: multByTen(a)

আমরা আগেই জেনেছি প্রতিটি ফাংশন কলের জন্য জাভাস্ক্রিপ্ট ইঞ্জিন একটি নতুন ফাংশন এক্সিকিউশন কন্টেক্স তৈরি করে। ফাংশন এক্সিকিউশন কন্টেক্স গ্লোবাল এক্সিকিউশন কন্টেক্সের মতই কিন্তু ফাংশন এক্সিকিউশন কন্টেক্স গ্লোবাল অবজেক্ট তৈরি করার পরিবর্তে এটি arguments অবজেক্ট তৈরি করে যা ফাংশনে পাস করা সকল প্যারামিটারের একটি রেফারেন্স ধারণ করে:

Function Execution Context (Creation Phase Browser)

  • arguments: Local Object
  • this: window
  • a: undefined

আমাদের উদাহরণে, ফাংশন এক্সিকিউশন কন্টেক্স arguments অবজেক্ট তৈরি করে যা ফাংশনে পাস করা সকল প্যারামিটারকে নির্দেশ করে, this এর মান হিসাবে গ্লোবাল অবজেক্টে window কে সেট করে। এবং a প্যারামিটার কে undefined হিসাবে ইনিশিয়ালাইজ করে।

Function Execution Context (Execution Phase Browser)

  • arguments: Local Object
  • this: window
  • a: 7

ফাংশন এক্সিকিউশন কন্টেক্সে Execution phase চলার সময়, এটি a প্যারামিটারে 7 অ্যাসাইন করে এবং ফলাফল (70) গ্লোবাল এক্সিকিউশন কন্টেক্সের results ভ্যারিয়েবলে রিটার্ন করেঃ

Global Execution Context (Execution Phase Browser)

  • window: Global Object
  • this: window
  • a: 7
  • multByTen: fn()
  • results: 70

আজকের লেখায়, ৭৩০ এর বেশি শব্দ পড়ে আমি বলতেই পারি আপনি জাভাস্ক্রিপ্টের এক্সিকিউশন কন্টেক্স, গ্লোবাল এক্সিকিউশন কন্টেক্সট এবং ফাংশন এক্সিকিউশন কন্টেক্স সম্পর্কে শিখেছেন। যদি কোন প্রশ্ন বা মতামত থাকে তাহলে অবশ্যই কমেন্ট করে জানাবেন। জাভাস্ক্রিপ্ট ইঞ্জিন সকল এক্সিকিউশন কন্টেক্স ট্র্যাক রাখতে কল স্ট্যাক নামক একটি Data Structure ব্যবহার করে। পরবর্তি কোন একটি আর্টিকেলে সেটি নিয়ে বিস্তারিত আলোচনা করার চেষ্টা করবো ইনশাআল্লাহ্‌।