नीचे दिए गए प्रश्न के कई उत्तर / तकनीक हैं:
- गोलांग संरचनाओं के लिए डिफ़ॉल्ट मान कैसे सेट करें?
- गोलंग में स्ट्रक्चर्स को इनिशियलाइज़ कैसे करें
मेरे पास कुछ उत्तर हैं लेकिन आगे चर्चा की आवश्यकता है।
नीचे दिए गए प्रश्न के कई उत्तर / तकनीक हैं:
मेरे पास कुछ उत्तर हैं लेकिन आगे चर्चा की आवश्यकता है।
जवाबों:
एक संभावित विचार अलग कंस्ट्रक्टर फ़ंक्शन लिखना है
//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()
उदाहरण के लिए) के माध्यम से त्वरित करने के लिए किसी तीसरे पक्ष (पुस्तकालय, उदाहरण के लिए) का उपयोग किया जाता है , तो यह आपके विशेष रूप से नामित कारखाने फ़ंक्शन के बारे में जानने की उम्मीद नहीं की जा सकती है। उस मामले में, और भाषा की कमी से ही बदल रहा है, केवल एक इंटरफ़ेस (जो पुस्तकालय के लिए जाँच कर सकता है) करेगा, मुझे लगता है।
संरचना (कंस्ट्रक्टर तरीका) प्राप्त करने के लिए एक विधि को बाध्य करें।
एक अच्छा डिजाइन अपने प्रकार को बिना लाइसेंस के बनाना है, लेकिन एक निर्यात किए गए निर्माण फ़ंक्शन जैसे न्यूमाइपे () को प्रदान करें जिसमें आप अपनी संरचना / प्रकार को ठीक से शुरू कर सकते हैं। एक इंटरफ़ेस प्रकार भी लौटाएं और एक ठोस प्रकार नहीं, और इंटरफ़ेस में वह सब कुछ होना चाहिए जो अन्य आपके मूल्य के साथ करना चाहते हैं। और आपके ठोस प्रकार को निश्चित रूप से उस इंटरफ़ेस को लागू करना चाहिए।
यह केवल प्रकार को खुद को अप्रमाणित बनाने के द्वारा किया जा सकता है। आप फ़ंक्शन NewSomething और यहां तक कि फ़ील्ड्स टेक्स्ट और डिफॉल्टट को निर्यात कर सकते हैं, लेकिन बस संरचना प्रकार कुछ निर्यात नहीं करते हैं
डिफ़ॉल्ट मॉड्यूल (लिंक में विकल्प 5) सेट करने के लिए कॉन्फ़िगरेशन संरचना का उपयोग करके आपके लिए स्वयं के मॉड्यूल के लिए इसे अनुकूलित करने का एक और तरीका है, हालांकि एक अच्छा तरीका नहीं है।
विक्टर ज़मानियन के उत्तर में विकल्प 1 के साथ एक समस्या यह है कि यदि प्रकार निर्यात नहीं किया जाता है, तो आपके पैकेज के उपयोगकर्ता इसे फ़ंक्शन मापदंडों के प्रकार के रूप में घोषित नहीं कर सकते हैं। इसके चारों ओर एक तरीका इसके बजाय एक इंटरफ़ेस निर्यात करना होगा संरचना जैसे
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 डिफ़ॉल्ट टैग default0 और default1 हैं ।
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"`
}