1 ফাংশন মৌলিক
প্রোগ্রামিং এ ফাংশন হলো একটি প্রিষ্ঠ কোড যা একটি নির্দিষ্ট কাজ সম্পাদন করে এবং ইনপুট প্যারামিটার এবং রিটার্ন ভ্যালু থাকতে পারে। গো ভাষায়, ফাংশনগুলি প্রোগ্রাম সংগ্রহ এবং পুনর্ব্যবহারের জন্য প্রচুর ব্যবহৃত হয়। ফাংশন ব্যবহার করা অদ্ভুতভাবে কোডটি আরও সংক্ষিপ্ত, খুব পঠিত এবং সহজে রক্ষণাবেক্ষণে করতে পারে।
ফাংশনগুলি গো ভাষার মৌলিক অংশ, এবং ফাংশন ঘোষণা এবং সংজ্ঞান করার জন্য কীভাবে বুঝতে হুবু তা গুরুত্বপূর্ণ।
2 ফাংশন সংজ্ঞান
2.1 ফাংশন ঘোষণা
গো ভাষায়, ফাংশন ঘোষণার সাধারণ ফর্ম হল:
func ফাংশনেরনাম(প্যারামিটার) রিটার্নটাইপ {
// ফাংশনের প্রধান অংশ
}
নিচের অংশগুলি ভাঙ্গা যাক:
-
func
কীওয়ার্ডটি একটি ফাংশন ঘোষণা করার জন্য ব্যবহৃত হয়। -
ফাংশনেরনাম
হল ফাংশনের নাম, যা গো ভাষার নেমিং অনুযায়ী পরামর্শ দেয়। একটি ক্যাপিটাল প্রাথমিক অক্ষরের ফাংশন এক্সপোর্টযোগ্য, অর্থাত এটি প্যাকেজের বাইরে দৃশ্যমান; ছোট অক্ষরের প্রাথমিক অক্ষরটি এক্সপোর্টযোগ্য নয় এবং কেবল একই প্যাকেজের ভিতরে ব্যবহার করা যাবে। -
প্যারামিটার
হল ফাংশনটি ব্যবহার করে এসেছে প্যারামিটারের তালিকা, কোমার দ্বারা পৃথক করা। প্রতিটি প্যারামিটারের ধরন নির্ধারণ করা আবশ্যক, এবং যদি একই ধরনের একাধিক প্যারামিটার হয়, তাহলে একই ধরনের প্যারামিটারের ধরনটি কেবল একবার নির্ধারণ করা যেতে পারে। -
রিটার্নটাইপ
হল ফাংশনের রিটার্ন ভ্যালুর ধরণ। যদি ফাংশনটি কোনও ভ্যালু রিটার্ন করে না, তবে এই অংশটি অপসারণ করা যাবে। যদি ফাংশনটি একাধিক ভ্যালু রিটার্ন করে, তাহলে এগুলি অংশনেশন্দে থাকতে হবে।
যেমন, আমরা দুটি পূর্ণসংখ্যার যোগফল গণনা করার জন্য একটি সাধারণ ফাংশন ঘোষণা করতে পারি:
func Add(a int, b int) int {
return a + b
}
এই উদাহরণে, ফাংশনের নাম হল Add
, এটি দুটি int
ধরনের প্রাচীর (a এবং b) গ্রহণ করে এবং তাদের সংযোজন করে প্রত্যাখ্যানের ধরন int
দিয়ে ফিরে।
2.2 প্যারামিটার তালিকা
প্যারামিটার তালিকা সংজ্ঞায়িত করে যে কোনও প্যারামিটার ফাংশনটি গ্রহণ করে এবং প্রতিটি প্যারামিটারের ধরন নির্ধারণ করে। প্যারামিটার হল ফাংশনে ডাটা পাঠানোর জন্য ব্যবহৃত একটি বিশেষ ধরনের ভেরিয়েবল।
func Greet(name string, age int) {
fmt.Printf("হ্যালো, %s! তুমি %d বছর বয়সী।\n", name, age)
}
এই Greet
ফাংশনে, name
এবং age
হল প্যারামিটার। name
এর ধরণ হল string
, এবং age
এর ধরণ হল int
। এই ফাংশনকে কল করার সময়, এই প্যারামিটারগুলির জন্য প্রাক্তন মান সরবরাহ করা আবশ্যক।
2.3 রিটার্ন টাইপ
ফাংশনগুলি গণনা করা ফলাফল রিটার্ন করতে পারে, এবং রিটার্ন টাইপটি ফাংশনের রিটার্ন ভ্যালুর ডেটা প্রকার নির্ধারণ করে। ফাংশনগুলির কোনও রিটার্ন ভ্যালু থাকতে পারে না, বা তাদের এক বা একাধিক রিটার্ন ভ্যালু থাকতে পারে।
যদি ফাংশনটির একাধিক রিটার্ন ভ্যালু থাকে, তাহলে তাদের ধরনগুলিকে ঘোষণা করার সময় লোপারেন্থেসে বন্ধ করা আবশ্যক:
func Divide(dividend, divisor float64) (float64, error) {
if divisor == 0 {
return 0, errors.New("শূন্য দ্বারা ভাগ করা যাবে না")
}
return dividend / divisor, nil
}
এই Divide
ফাংশনটি দুটি মান রিটার্ন করে: মখ্যভাজন এবং একটি ত্রুটি বার্তা। যদি ভাজকটি শূন্য হয়, তবে একটি ত্রুটি রিটার্ন হয়।
2.4 Variadic প্যারামিটার
গোল্ডাঙ্গলিতে, যখন আমরা নিশ্চিত না করে যে ফাংশনটি কলার কত প্যারামিটার পাঠাবে, তখন আমরা variadic প্যারামিটার ব্যবহার করতে পারি। Variadic প্যারামিটারগুলি দিয়ে রকমারি দশের অনুমতি প্রদান করা হয়, অর্থাৎ, ফাংশনটি যে কোন সংখ্যক প্যারামিটার গ্রহণ করতে পারে। এটি অনিশ্চিত পরিমাণের ডেটা বা নির্দিষ্ট ধরনের ফাংশন, সারাংশ বা বিশ্লেষণ করার ফ্যাংশনের ধরনের কাজ করতে খুব কার্যকর।
অ্যাপ্লিকেশন সিনারিও
ভেরিয়েবল প্যারামিটারগুলি সাধারণভাবে নিম্নলিখিত উপকারের জন্য ব্যবহৃত হয়:
-
স্ট্রিং সংযোজন: যেমন
fmt.Sprintf
এবংstrings.Join
এমন ফাংশনসমূহে। - অ্যারে/স্লাইস প্রসেসিং: যখন অশোধারণ লম্বার বা বহুল স্লাইস নিয়ে কাজ করা হয়, উদাহরণস্বরূপ প্রমাণ অথবা একাধিক স্লাইসের সংযোজন করার সময়।
-
লগিং এবং ত্রুটি হ্যান্ডলিং: এখানে বহুগুন ত্রুটি বা অনেক লগ তথ্য নিয়ে কাজ করা থাকে, উদাহরণস্বরূপ
log.Printf
বা কাস্টম ত্রুটি সংক্ষেপণ ফাংশন থেকে। - সাহায্যক ফাংশনসমূহ: গন্ডিতের প্রায় আপিয়া বা লাইব্রেরীতে ব্যবহারকারীদের কল ফাংশনের এক
ভ্যারিয়েবল প্যারামিটার ব্যবহার
এখানে একটি সাধারণ উদাহরণ দেওয়া হল ভ্যারিয়েবল প্যারামিটার ব্যবহার করার:
// একটি ফাংশন ডিফাইন করুন যা বিভিন্ন পূর্ণসংখ্যামূলক প্যারামিটার গ্রহণ করে এবং তাদের সমষ্টি প্রদান করে
func Sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func main() {
// আপনি যেকোনো সংখ্যক প্যারামিটার পাস করতে পারেন
fmt.Println(Sum(1, 2)) // আউটপুট: 3
fmt.Println(Sum(1, 2, 3, 4)) // আউটপুট: 10
// আপনি একটি স্লাইসও পাস করতে পারেন এবং স্লাইসের পরে এলিপ্সিস ব্যবহার করতে পারেন
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(Sum(numbers...)) // আউটপুট: 15
}
Sum
ফাংশনে, nums
হল একটি পূর্ণসংখ্যা স্লাইস যা Sum
ফাংশনে পাঠানো সব প্যারামিটার ধারণ করে। আমরা এই স্লাইসের মাধ্যমে range লুপ ব্যবহার করে প্রত্যেক প্যারামিটারের সমষ্টি গণনা করতে পারি।
মনে রাখতে হবে যে, ফাংশনের ভ্যারিয়েবল প্যারামিটারের সাথে প্রাথমিকভাবে একটি স্লাইস আছে, তার মাধ্যমে সব স্লাইস-সম্পর্কিত প্রচারিত মূল্যনির্ধারণ ব্যবহার করা যায়। ফাংশনে একটি স্লাইস ভ্যারিয়েবল প্যারামিটার পাঠাতে যখন আপনি কাউন্টারের পরে এলিপ্সিস ...
যোগ করুন।
ভ্যারিয়েবল প্যারামিটার ব্যবহার করা ফাংশন কল বেশ কলাকার এবং সংক্ষেপে করতে পেরে, তবে এটি আওঁ পারফরম্যান্সের উপর সামর্থ্য দেয়, কারণ ভ্যারিয়েবল প্যারামিটার ব্যবহারে স্লাইস গঠন এবং মেমোরি আবনি নিয়ে। তাই, যদি কঠিন পারফরম্যান্স প্রয়োজন হয়, তবে সতর্কতা অবলম্বন করুন।
প্রসঙ্গ: এর বিস্তৃত ব্যাখ্যা পরবর্তী অধ্যায়ে সরবরাহ করা হবে। যদি আপনার অন্য প্রোগ্রামিং ভাষার অভিজ্ঞতা থাকে, তবে আপনি এগুলি টার সামান্য হিসেবে ধারণ করতে পারবেন।
3 ফাংশন কল
3.1 বেসিক ফাংশন কল
ফাংশন কল করতে ব্যবহার করা হলে ফাংশনের কোড অনুপাতে ব্যবহৃত করা হয়। Go তে, একটি সাংগঠিত ফাংশন কল খুব সারল, কেবল ফাংশনের নাম ব্যবহার করুন এবং উচিত প্যারামিটার পাস করুন। উদাহরণস্বরূপ:
result := add(3, 4)
fmt.Println(result) // আউটপুট: 7
এই উদাহরণে, add
ফাংশনটি কল করা হয়েছে এবং দুটি পূর্ণসংখ্যা প্যারামিটার পাঠানো হয়েছে, এবং তারপরে ফিরে আসা ফলাফলটির result
ভ্যারিয়েবলে অর্পিত করা হয়েছে।
3.2 প্যারামিটার পাস
ফাংশনে প্যারামিটার পাস করা সময়, Go পরিচিতি থাকে পাস-বাই-ভ্যালু ব্যবহার করার সাথে, যা মানে প্যারামিটার মানের একটি কপি পাঠানো এবং মূল ডেটা পরিবর্তিত হবে না। তবে, যদি আপনি ফাংশনটির বাইরের চেহারা বা পারফরম্যান্সের কারণে প্যারামিটার পরিবর্তন করতে চান, তাহলে আপনি পয়েন্টার ব্যবহার বা বড় স্ট্রাক্চার পাস করার মত পাস-বাই-রেফারেন্স ব্যবহার করতে পারেন।
এখানে পাস-বাই-ভ্যালু এবং পাস-বাই-রেফারেন্স এর উদাহরণ:
// এর পাস-বাই-ভ্যালু এর উদাহরণ
func double(val int) {
val *= 2
}
// এর পাস-বাই-রেফারেন্স এর উদাহরণ
func doublePtr(val *int) {
*val *= 2
}
func main() {
value := 3
double(value)
fmt.Println(value) // 3 আউটপুট, value বজায় রাখা থাকলো
doublePtr(&value)
fmt.Println(value) // 6 আউটপুট, value ডাবল হয়েছে
}
উপরের উদাহরণে, double
ফাংশন বিবেচনা করে পৃথক val
ঃ তার কাপি ডাবল করার চেষ্টা করে, তাকে মূল value
ভ্যারিয়েবলটি পরিবর্তন করে না। তবে, doublePtr
ফাংশন মৌলি ভ্যারিয়েবলের মান পরিবর্তন করে এবং শুধু একটি ইন্টিজার ভ্যারিয়েবলের পয়েন্টার বিদ্যমান হবার কারনে তারপরে doublePtr
সাব ফাংশনটি &
সহ পাস করা হয়।