নীচের প্রশ্নের একাধিক উত্তর / কৌশল রয়েছে:
- গোলং স্ট্রাইকগুলিতে ডিফল্ট মানগুলি কীভাবে সেট করবেন?
- গোলংয়ে স্ট্রাক্ট কীভাবে শুরু করবেন
আমার কয়েকটি উত্তর আছে তবে আরও আলোচনা করা দরকার।
নীচের প্রশ্নের একাধিক উত্তর / কৌশল রয়েছে:
আমার কয়েকটি উত্তর আছে তবে আরও আলোচনা করা দরকার।
উত্তর:
একটি সম্ভাব্য ধারণা পৃথক কনস্ট্রাক্টর ফাংশন লিখতে হয়
//Something is the structure we work with
type Something struct {
Text string
DefaultText string
}
// NewSomething create new instance of Something
func NewSomething(text string) Something {
something := Something{}
something.Text = text
something.DefaultText = "default text"
return something
}
NewSomething
এবং এমনকি ক্ষেত্রগুলি Text
এবং রফতানি করতে পারেন DefaultText
তবে কেবল স্ট্রাক টাইপটি রফতানি করবেন না something
।
reflect.New()
উদাহরণস্বরূপ, মাধ্যমে ), এটি আপনার বিশেষভাবে নামযুক্ত কারখানার ফাংশন সম্পর্কে জানার আশা করা যায় না। সেক্ষেত্রে এবং ভাষা নিজেই পরিবর্তিত হচ্ছে, কেবলমাত্র একটি ইন্টারফেস (যা গ্রন্থাগারটি যাচাই করতে পারে) করতে পারে, আমি মনে করি।
স্ট্রাক্ট (কনস্ট্রাক্টর ওয়ে) পেতে একটি পদ্ধতিকে জোর করুন।
একটি ভাল নকশা আপনার প্রকারকে অপ্রত্যাশিত তৈরি করা, তবে নিউমাইটাইপ () এর মতো একটি রফতানি কনস্ট্রাক্টর ফাংশন সরবরাহ করা যাতে আপনি আপনার স্ট্রাক্ট / টাইপটি সঠিকভাবে শুরু করতে পারেন। এছাড়াও একটি ইন্টারফেসের প্রকারটি ফেরত দিন, কংক্রিটের ধরণের নয় এবং ইন্টারফেসে অন্যেরা আপনার মানটি নিয়ে যা করতে চায় তা থাকা উচিত। এবং আপনার কংক্রিটের ধরণের অবশ্যই সেই ইন্টারফেসটি অবশ্যই প্রয়োগ করতে হবে।
এটি কেবল নিজেই টাইপটিকে অনাবাদী করে তৈরি করা যায়। আপনি নিউসোমিংথিং এবং এমনকি ক্ষেত্রগুলি পাঠ্য এবং ডিফল্ট টেক্সট রপ্তানি করতে পারেন, তবে কেবল স্ট্রাক টাইপ কিছু রফতানি করবেন না
আপনার নিজের মডিউলটির জন্য এটি কাস্টমাইজ করার আরেকটি উপায় হ'ল ডিফল্ট মান নির্ধারণের জন্য একটি কনফিগার স্ট্রাক্ট ব্যবহার করা (লিঙ্কটিতে অপশন 5) যদিও ভাল উপায় নয়।
ভিক্টর জামানিয়ানের উত্তরের 1 বিকল্পের একটি সমস্যা হ'ল যদি প্রকারটি রফতানি না করা হয় তবে আপনার প্যাকেজের ব্যবহারকারীরা এটিকে ফাংশন প্যারামিটারগুলির প্রকার হিসাবে ঘোষণা করতে পারবেন না this এর চারপাশের একটি উপায় হ'ল পরিবর্তে একটি ইন্টারফেস রফতানি করা কাঠামো যেমন
package candidate
// Exporting interface instead of struct
type Candidate interface {}
// Struct is not exported
type candidate struct {
Name string
Votes uint32 // Defaults to 0
}
// We are forced to call the constructor to get an instance of candidate
func New(name string) Candidate {
return candidate{name, 0} // enforce the default value here
}
যা আমাদের রফতানি হওয়া প্রার্থী ইন্টারফেস ব্যবহার করে ফাংশন প্যারামিটারের প্রকারগুলি ঘোষণা করতে দেয়। এই সমাধানটি থেকে কেবলমাত্র অসুবিধাটি আমি দেখতে পাচ্ছি তা হ'ল আমাদের সমস্ত পদ্ধতিগুলি ইন্টারফেস সংজ্ঞাতে ঘোষিত হওয়া দরকার তবে আপনি যুক্তি দিতে পারেন যে যাইহোক এটি ভাল অনুশীলন।
Votes unit32
সম্ভবত হওয়া উচিতVotes uint32
ট্যাগ সহ এটি করার একটি উপায় রয়েছে যা একাধিক ডিফল্টের জন্য অনুমতি দেয়।
ধরে নিন আপনার 2 টি ডিফল্ট ট্যাগ ডিফল্ট 0 এবং ডিফল্ট 1 সহ নিম্নলিখিত স্ট্রাক্ট রয়েছে ।
type A struct {
I int `default0:"3" default1:"42"`
S string `default0:"Some String..." default1:"Some Other String..."`
}
এখন ডিফল্ট সেট করা সম্ভব।
func main() {
ptr := &A{}
Set(ptr, "default0")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=3 ptr.S=Some String...
Set(ptr, "default1")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=42 ptr.S=Some Other String...
}
এখানে একটি খেলার মাঠে সম্পূর্ণ প্রোগ্রাম ।
আপনি যদি আরও জটিল উদাহরণে আগ্রহী হন তবে স্লাইস এবং মানচিত্রের সাহায্যে বলুন, তবে ক্রাইস্ট / ডিফল্ট দেখুন
Https://golang.org/doc/effective_go.html#composite_literals থেকে :
কখনও কখনও শূন্য মান যথেষ্ট ভাল না এবং একটি আরম্ভের কনস্ট্রাক্টর প্রয়োজনীয়, যেমন প্যাকেজ ওএস থেকে প্রাপ্ত উদাহরণ হিসাবে।
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := new(File)
f.fd = fd
f.name = name
f.dirinfo = nil
f.nepipe = 0
return f
}
type Config struct {
AWSRegion string `default:"us-west-2"`
}