1 গোল্ডার defer
ফিচারের পরিচিতি
Go ভাষায়, defer
স্টেটমেন্ট এটির পশ্চাতে যে ফাংশন কল পরে সেটির পরিষ্কার উদ্দেশ্য ছিল আপনি তা যে আমি নির্ধারিত একটি তত্ত্ব সম্পাদনা করতে চেষ্টা করুন।finally
ব্লকের মতো, কিন্তু defer
এর ব্যবহার বেশ সহজ এবং অনন্য।
defer
ব্যবহার করার সু-লাভ হচ্ছে যে, এটি ব্যবহার করা যেতে পারে পরিষ্কার কাজ, যেমন ফাইল বন্ধ করা, লক আনলক করা, বা মাত্র একটি ফাংশনের বাহিরে প্রস্থান সময় রেকর্ড করা। এটি প্রোগ্রামটি টান্কন করা সম্পূর্ণ বাননা এবং অগ্রগতি করা এবং অপশন হ্যান্ডলিংয়ে প্রোগ্রাম আরও সহজ ও ড্রম্ব করতে পারে। গোভাষার ডিজাইন দর্শনে, defer
এর ব্যবহারকে পরামর্শ দেয় কারণ যদি কোন আপশন বা স্রোত লকনের যাত্রা যাওয়া যায়।
2 defer
এর কাজের সিদ্ধান্ত
2.1 মৌলিক কাজের সিদ্ধান্ত
defer
এর মৌলিক কাজের সিদ্ধান্ত হ'ল প্রতিটি পেয়াদা করিতে একটি স্ট্যাক (সর্বশেষে প্রথম থেকে বাহিরে যাওয়ার নীতি) ব্যবহার করা। যখন defer
স্টেটমেন্ট দেখা যা থাকে, গো ভাষা নিকটবর্তী ফাংশনটির কাজ বর্তমানে দেওয়ার আগে ব্যবস্থানে নেয়া না। পরতে, এটি একটি নিটিগত স্ট্যাকে ঢুকায়। শুধুমাত্র বাইরের ফাংশন যখন প্রত্যাবর্তন করতে যায়, এই প্যারামিতেরা defer
কাজ স্ট্যাকের আদেশে করা হবে, সর্বশেষ প্রক্লারকে প্রথমে ব্যাবস্থান করা হবে।
অতএব, এটি মনে রাখা মূল্যবান যে defer
স্টেটমেন্টের পরে ফাংশনের প্যারামিটারগুলি গণনা করা এবং সিদ্ধান্ত করা হয় সত্যিক কাজ চলতে তারিখটিতে এই defer
ঘোষণা করা হয়, যেটি সর্বাধিক বাধা স্ট্যাকের স্যারা সরল বিবর্গ হয় বিবর্তনের প্যারামিটার হয়।
func example() {
defer fmt.Println("world") // প্রতিযোগী
fmt.Println("hello")
}
func main() {
example()
}
উপরের কোডটি আউটপুট দিবে:
hello
world
world
"hello" থেকে আগে ইস্যু হবে, যদি বাক্য দায়ান হয় না।
2.2 একাধিক defer
স্টেটমেন্টের প্রক্রিয়ার মুখ্যমুখিতা
একজন যখন বৈশিষ্ট্যির মানের বৈশিষ্ট্যির আদেশ অনুসরণ করছে, তাদের ফাংশন হবে সর্বশেষে প্রথমে ডিফার করা। এটি ব্যগ্রতার কঠিন লজিক বুঝতে প্রধানরূপে গুরুত্বপূর্ণ। আগমনের উদাহরণে একাধিক defer
স্টেটমেন্টের প্রক্রিয়ার প্রক্রিয়ার:
func multipleDefers() {
defer fmt.Println("First defer")
defer fmt.Println("Second defer")
defer fmt.Println("Third defer")
fmt.Println("Function body")
}
func main() {
multipleDefers()
}
এই কোডের আউটপুট হবে:
Function body
Third defer
Second defer
First defer
মৌলিক কারণে "First defer" চলে চলে সর্বশেষ হবে গুলি দ্বারা অনুষ্ঠিত হবে হবে, এটি সর্বশেষ সরল
3 বিভিন্ন পরিস্থিতিতে defer
এর অপেক্ষায় ব্যবহার
3.1 সম্পদ মুক্তি
Go ভাষায়, defer
স্টেটমেন্ট সাধারণভাবে সম্পদ মুক্তির লজিকের সাথে সম্পর্কিত কাজ করতে ব্যবহৃত হয়, যেমন ফাইল কাজ এবং ডাটাবেস সংযোগ। defer
বিনা Kolkata ভাবে বিবেচিত করবে যে সে প্রস্থানের কারণে যে কোন ফাংশন থেকে যে কোন সময়ে সম্পদ সঠিকভাবে মুক্তি পড়ে হবে।
ফাইল অপারেশনের উদাহরণ:
func ReadFile(filename string) {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
// ফাইলটি বন্ধ হবে নিশ্চিত করতে ব্যবহার করুন না দেওয়া হয়
defer file.Close()
// ফাইল পড়ার অপারেশন ...
}
এই উদাহরণে, একবার os.Open
কোনও ফাইল খোলা থাকে, উদ্বোধন প্যারামিটারগুলির বিশেষ ভাবে মুক্তি সর্বনিম্ন হবে কিনা তা নিশ্চিত হবে এবং ফাইল এবং ফাইল হ্যান্ডল সম্পদটি সঠিকভাবে মুক্তি প্রদান করা হবে ফাংশন সমাপ্ত হওয়াকে।
ডাটাবেস সংযোগের উদাহরণ:
func QueryDatabase(query string) {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
log.Fatal(err)
}
// ডাটাবেস সংযোগটি বন্ধ করা সত্যাপনের সঙ্গে নিশ্চিত করুন ব্যবহার করুন না
defer db.Close()
// ডাটাবেস কুয়ারি অপারেশন ...
}
অনুরূপভাবে, defer db.Close()
এটি কোনও কারণে নিষ্ক্রিয় (নিয়মিত পরিস্থিতি বা স্থানীয় হারিয়ে থাকা) দিয়া ডাটাবেস সংযোগ সমাপ্ত হওয়াতে ওসত হবে।
3.2 সমভাব্য প্রোগ্রামিংয়ে লক অপারেশন
অসংলগ্ন প্রোগ্রামিং প্রক্রিয়ায়, লক ছুড়ানোর জন্য defer
ব্যবহার করা টিকল। এটি বিশেষ প্রয়োজনে সিক্রিয় অধীনের লক বিশ্রাম নিশ্চিত মাধ্যমে লক করা হওয়ার বাধা করার অনুষ্ঠানিক কোড বা বাদে মুক্তি প্রদান।
মিউটেক্স লক উদাহরণ:
var mutex sync.Mutex
func updateSharedResource() {
mutex.Lock()
// লক মুক্ত করা নিশ্চিত করতে defer ব্যবহার করুন
defer mutex.Unlock()
// ভাগীদারি সংস্থানে পরিবর্তন করুন...
}
ভাগীদারি সংস্থানের সম্পাদনা সফল হোক না কেন, বা প্যানিক ঘটতে পারে, defer
এটি নিশ্চিত করবে যে Unlock()
সংমিলিত করা আছে, যেটি অন্যান্য goroutine গুলোর জন্য লক ভাঙতে দেবে।
সূত্র: মিউটেক্স লক সম্পর্কিত বিস্তারিত ব্যাখ্যা পরবর্তী অধ্যায়গুলিতে অন্তর্ভুক্ত করা হবে। এই মুহূর্তে defer-এর অ্যাপ্লিকেশন স্কেনারিওগুলি বুঝে রাখা যাকে পর্যবেক্ষণ করা হবে।
3 Common Pitfalls and Considerations for defer
defer
ব্যবহার করার সময়, যদিও কোডের পঠনীয়তা এবং রক্ষণযোগ্যতা উন্নত হয়, তবুও মনে রাখতে হয় কিছু চিংড় এবং বিবেচনা করার অবস্থা রয়েছে।
3.1 ডিফার ফাংশনের প্যারামিটার তাকিয়ে দেওয়া আগামীকালে মূল্যায়ন করা হয়
func printValue(v int) {
fmt.Println("মান:", v)
}
func main() {
value := 1
defer printValue(value)
// `value` এর মান পরিবর্তন করা হলেও এটি defer দ্বারা প্রয়োগ করা প্যারামিটারে প্রভাব ফেলবে না
value = 2
}
// আউটপুট হবে "মান: 1"
defer
স্টেটমেন্ট পরে মানের পরিবর্তনের পরে যদিও printValue
এ প্যারামিটার প্রদান করা হয়েছিল, তবুও প্যারামিটারটি ধরে নেওয়া হয়ে যায়, তাই আউটপুটটি এখনো "মান: 1" হবে।
3.2 লুপের ভেতরে defer ব্যবহারের সঙ্গে সাবধানি অবশ্যই অবলম্বন করুন
লুপের ভিতরে defer
ব্যবহার করা, প্রয়োগ শেষ হওয়ার পূর্বে সম্পদ মুক্তি পান না এর কারণে সম্পদ চুরি বা উপযোগীকরণের অভাবের ফলে হতে পারে।
3.3 সদ্যকালে ব্যবহারের পর মুক্তি দিন "release after use" থেকে বিরতি নিন
সময়-অনুচ্ছেদিক প্রোগ্রামে, defer
ব্যবহার করে সম্পদ মুক্তি পাওয়ার আগে, পরিযোজনা করা গর্ন্ত করা জরুরি, নিশ্চিত করা উচিত যে, সম্পদের মুক্তি দেওয়ার পর আরওটি অ্যাক্সেস করার চেষ্টা করবে না, এই জন্যে রেস অবস্থা প্রতিরোধ করা জরুরি।
4. defer
স্টেটমেন্টের ক্রিয়া অনুসারের গণনার দিক
defer
স্টেটমেন্টগুলি Last-In-First-Out (LIFO) প্রিন্সিপল অনুসারে অনুষ্ঠান করে, যেখানে শেষ ঘোষিত defer
প্রথমে অনুষ্ঠান করা হবে।
সমাধান এবং সেরা প্রথা:
- সদয় হোন যে,
defer
স্টেটমেন্টের ফাংশন প্যারামিটারগুলি শ্বাত প্রকটি যাচাই করা হয়েছিল - লুপের ভেতরে
defer
ব্যবহার করার সময়, বেনামী বা সুস্পষ্টভাবে সম্পদ মুক্তি দিতে বা প্রদান করার আলোচনা করা হতে পারে - একটি সময়-অনুচ্ছেদিক পরিবেশে, নিশ্চিত করা জরুরি যে,
defer
ব্যবহার করে সম্পদের মুক্তি লবার পূর্বে সমস্ত গরুটাইন তাদের অপারেশন শেষ করেছেন - অনেকগুলি
defer
স্টেটমেন্ট যুক্ত করা বা তাদের নিয়মিত অনুষ্ঠান এবং তাদের যোগ্যতা নিয়ে ভাবী গম্যানা করুন।
এই সেরা প্রথা মেনে চলার মাধ্যমে ডিফার ব্যবহারকারীরা সামগ্রিকভাবে অIt could be a useful tool for writing more robust and maintainable Go programs. This best practice will be helpful in avoiding most issues encountered when using defer
and creating more reliable Go code.