গো-তে, একটি ফাংশন কেবলমাত্র ফাংশন সংজ্ঞাতে পরামিতি তালিকায় নির্দিষ্ট ধরণের যুক্তি গ্রহণ করতে পারে। বৈকল্পিক প্যারামিটার ভাষার বৈশিষ্ট্যটি কিছুটা জটিল করে তোলে তবে এটি যথাযথভাবে সংজ্ঞায়িত নিয়ম অনুসরণ করে।
ফাংশনের স্বাক্ষরটি fmt.Println
হ'ল:
func Println(a ...interface{}) (n int, err error)
প্রতি ভাষা specifiction ,
একটি ফাংশন স্বাক্ষরের চূড়ান্ত ইনকামিং প্যারামিটারটির একটি প্রিফিক্সযুক্ত প্রাইস থাকতে পারে .... এই জাতীয় পরামিতি সহ একটি ফাংশনটিকে ভেরিয়াদিক বলা হয় এবং সেই পরামিতির শূন্য বা আরও বেশি যুক্তি যুক্ত করা যেতে পারে।
এর অর্থ আপনি প্রকারের Println
আর্গুমেন্টের একটি তালিকা পাস করতে পারেন interface{}
। যেহেতু সমস্ত ধরণের খালি ইন্টারফেস বাস্তবায়িত হয়, আপনি কোনও প্রকারের আর্গুমেন্টের একটি তালিকা পাস করতে পারেন Println(1, "one", true)
, উদাহরণস্বরূপ, ত্রুটি ছাড়াই আপনি কল করতে সক্ষম হন । দেখুন "এ ... পরামিতি আর্গুমেন্ট পাসিং" বিভাগে ভাষা স্পেসিফিকেশন-এর:
পাস করা মান হ'ল একটি নতুন ধরণের টুকরো [] টি একটি নতুন অন্তর্নিহিত অ্যারে সহ যার ধারাবাহিক উপাদানগুলি আসল যুক্তি, যা সকলকে অবশ্যই টিতে নির্ধারিত হতে হবে T
যে অংশটি আপনাকে সমস্যা দিচ্ছে তা নির্দিষ্টকরণের ঠিক পরে:
যদি চূড়ান্ত যুক্তি একটি স্লাইস ধরণের [] টি তে নির্ধারিত হয় তবে এটি আর্গুমেন্টটি অনুসরণ করা হয় ... টি প্যারামিটারের মান হিসাবে অপরিবর্তিত হতে পারে .... এই ক্ষেত্রে কোনও নতুন স্লাইস তৈরি করা হয় না।
flag.Args()
টাইপ হয় []string
। যেহেতু T
এ Println
হলinterface{}
, []T
হয় []interface{}
। সুতরাং প্রশ্নটি নেমে আসে কিনা একটি স্ট্রিং স্লাইস মান ইন্টারফেসের স্লাইস টাইপের একটি পরিবর্তনশীলকে নির্ধারিত হয়। আপনি কোনও অ্যাসাইনমেন্ট চেষ্টা করে আপনার গো কোডে সহজেই এটি পরীক্ষা করতে পারেন, উদাহরণস্বরূপ:
s := []string{}
var i []interface{}
i = s
আপনি যদি এই জাতীয় কোনও কার্যকারিতা চেষ্টা করেন, সংকলক এই ত্রুটি বার্তাকে আউটপুট দেবে:
cannot use s (type []string) as type []interface {} in assignment
এবং এ কারণেই আপনি স্ট্রল স্লাইসের পরে উপবৃত্তিকে যুক্তি হিসাবে ব্যবহার করতে পারবেন না fmt.Println
। এটি কোনও বাগ নয়, এটি ইচ্ছাকৃতভাবে কাজ করছে।
সেখানে উপায়ে আপনি মুদ্রণ করতে পারেন এখনও প্রচুর আছে flag.Args()
সঙ্গে Println
যেমন
fmt.Println(flag.Args())
(যা [elem0 elem1 ...]
প্রতি হিসাবে আউটপুট হবে এফএমটি প্যাকেজ নথি )
বা
fmt.Println(strings.Join(flag.Args(), ` `)
(যা স্ট্রিং স্লাইস উপাদানগুলিকে আউটপুট দেবে, প্রত্যেকে একটি একক স্থান দ্বারা পৃথক করা হবে) উদাহরণস্বরূপ স্ট্রিং বিভাজক সহ স্ট্রিং প্যাকেজে জোড় ফাংশনটি ব্যবহার করে ।
go run test.go some test flags
) দিয়ে জগাখিচুড়ি করছিলাম , এবং যখনflags.Args()...
ঠিকflag.Args()
( পরিবর্তিত আউটপুটটি[some test flags]
নিউলাইন দ্বারা অনুসরণ করা হয়েছে; প্রকৃত পতাকাগুলি নিবন্ধকরণের সাথেও কাজ করবে বলে মনে হচ্ছে) কাজ করে যাচ্ছিল seemed কেন বোঝার ভান করবেন না, এবং স্টিফেনের উত্তর যাইহোক