গো স্ট্রাক্টগুলিতে কীভাবে ডিফল্ট মান সেট করা যায়


143

নীচের প্রশ্নের একাধিক উত্তর / কৌশল রয়েছে:

  1. গোলং স্ট্রাইকগুলিতে ডিফল্ট মানগুলি কীভাবে সেট করবেন?
  2. গোলংয়ে স্ট্রাক্ট কীভাবে শুরু করবেন

আমার কয়েকটি উত্তর আছে তবে আরও আলোচনা করা দরকার।



@ আইকিজা আপনি যে উত্তর দিয়েছেন তা করার একটি উপায় দেয় তবে প্রশ্ন শিরোনাম অনুসারে এটি কোনওভাবেই সাদৃশ্যপূর্ণ বা অনুসন্ধানযোগ্য নয় কারণ এটি একটি খুব নির্দিষ্ট প্রশ্ন। যদিও আমি আমার উত্তরে লিঙ্কটি যুক্ত করব।
প্রীতেক

এখানে দুটি প্রশ্ন রয়েছে, একটি বাছাই করুন। ধরে নিচ্ছি যে আপনি প্রথম প্রশ্নের (প্রশ্নের শিরোনাম অনুসারে) বিকল্প বেছে নিয়েছেন, দয়া করে আপনার পূর্ববর্তী গবেষণা সম্পর্কে আরও সুনির্দিষ্ট হন এবং যেখানে আপনার অন্যান্য উত্তরগুলির জন্য আরও আলোচনার প্রয়োজন হয়, ,.
ডানকান জোন্স

উত্তর:


96

একটি সম্ভাব্য ধারণা পৃথক কনস্ট্রাক্টর ফাংশন লিখতে হয়

//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
}

6
হ্যাঁ, আমি আমার উত্তরে উল্লেখ করেছি এটির মধ্যে একটি উপায় তবে আমরা কাউকে কেবল এই ফাংশনটি ব্যবহার করতে বাধ্য করতে পারি না এমন কোনও উপায় নেই।
প্রীতেক

@ প্রীতেক এটি হয় এটি হয় বা একটি ইন্টারফেস ব্যবহার করুন যা কুরুচিপূর্ণ এবং অত্যধিক জটিল হবে।
OneOfOne

31
@ প্রীতেক হ্যাঁ, আপনি যদি এই টাইপটি নিজেকে অনাবাদী করে তৈরি করেন তবে আপনি লোককে এই নির্মাতা ব্যবহার করতে বাধ্য করতে পারেন। আপনি ফাংশন NewSomethingএবং এমনকি ক্ষেত্রগুলি Textএবং রফতানি করতে পারেন DefaultTextতবে কেবল স্ট্রাক টাইপটি রফতানি করবেন না something
অমিত কুমার গুপ্ত

1
সমস্যাটি আরও খারাপ ... যদি কোনও তৃতীয় পক্ষ (উদাহরণস্বরূপ গ্রন্থাগার) আপনার স্ট্রাক্টটি ইনস্ট্যান্ট করার জন্য ব্যবহৃত হয় ( reflect.New()উদাহরণস্বরূপ, মাধ্যমে ), এটি আপনার বিশেষভাবে নামযুক্ত কারখানার ফাংশন সম্পর্কে জানার আশা করা যায় না। সেক্ষেত্রে এবং ভাষা নিজেই পরিবর্তিত হচ্ছে, কেবলমাত্র একটি ইন্টারফেস (যা গ্রন্থাগারটি যাচাই করতে পারে) করতে পারে, আমি মনে করি।
এডাম

1
এটি ডিফল্ট সেট করা ভাল, তবে কখনও কখনও আমি ডিফল্টকে ওভাররাইড করতে চাই। এই ক্ষেত্রে আমি ডিফল্ট নয় এমন মান সহ একটি কাঠামো আরম্ভ করতে সক্ষম হব না। আমার জন্য একটু বিরক্তিকর
জুলিয়েটজিন

68
  1. স্ট্রাক্ট (কনস্ট্রাক্টর ওয়ে) পেতে একটি পদ্ধতিকে জোর করুন।

    একটি ভাল নকশা আপনার প্রকারকে অপ্রত্যাশিত তৈরি করা, তবে নিউমাইটাইপ () এর মতো একটি রফতানি কনস্ট্রাক্টর ফাংশন সরবরাহ করা যাতে আপনি আপনার স্ট্রাক্ট / টাইপটি সঠিকভাবে শুরু করতে পারেন। এছাড়াও একটি ইন্টারফেসের প্রকারটি ফেরত দিন, কংক্রিটের ধরণের নয় এবং ইন্টারফেসে অন্যেরা আপনার মানটি নিয়ে যা করতে চায় তা থাকা উচিত। এবং আপনার কংক্রিটের ধরণের অবশ্যই সেই ইন্টারফেসটি অবশ্যই প্রয়োগ করতে হবে।

    এটি কেবল নিজেই টাইপটিকে অনাবাদী করে তৈরি করা যায়। আপনি নিউসোমিংথিং এবং এমনকি ক্ষেত্রগুলি পাঠ্য এবং ডিফল্ট টেক্সট রপ্তানি করতে পারেন, তবে কেবল স্ট্রাক টাইপ কিছু রফতানি করবেন না

  2. আপনার নিজের মডিউলটির জন্য এটি কাস্টমাইজ করার আরেকটি উপায় হ'ল ডিফল্ট মান নির্ধারণের জন্য একটি কনফিগার স্ট্রাক্ট ব্যবহার করা (লিঙ্কটিতে অপশন 5) যদিও ভাল উপায় নয়।




FWIW, আমি মনে করি এটি 'অপশন 3' - কমপক্ষে ওয়েবব্যাক মেশিনের লিঙ্কে। (সেখানে কোনও 'অপশন 5' নেই)।
ডেসিমাস ফস্টল

@ এম 90 গোলাপকে নীরব করার জন্য আপনি আপনার ফাংশনটিকে পাবলিক ইন্টারফেস টাইপের প্রত্যাবর্তন হিসাবে ঘোষণা করতে পারেন
টমাস গ্রেনার

@ থমাস গ্রেনগার আমার মন্তব্য এই উত্তরটির পূর্ববর্তী সংশোধনকে উল্লেখ করেছে বলে মনে হচ্ছে, এটি আসলে এর মতো আর কোনও ধারণা দেয় না :) আমি কেবল এটি মুছে ফেলব।
এম 90

32

ভিক্টর জামানিয়ানের উত্তরের 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
পার্টিলিচ

পছন্দ করেছেন স্থির করা উচিত।
wolfson109

13

ট্যাগ সহ এটি করার একটি উপায় রয়েছে যা একাধিক ডিফল্টের জন্য অনুমতি দেয়।

ধরে নিন আপনার 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...
}

এখানে একটি খেলার মাঠে সম্পূর্ণ প্রোগ্রাম

আপনি যদি আরও জটিল উদাহরণে আগ্রহী হন তবে স্লাইস এবং মানচিত্রের সাহায্যে বলুন, তবে ক্রাইস্ট / ডিফল্ট দেখুন


অনেক ধন্যবাদ! আমি লাইব্রেরির পরামর্শ অনুসারে একই কোডটি লিখতে শুরু করেছি এবং এই পোস্টটি জুড়ে এসেছি। এটি আপনার প্রত্যাশা ঠিক কী করে ( github.com/creasty/defaults )। যদি আপনার কোনও মান না থাকে তবে এটি ডিফল্ট সেট করে, তবে আপনি যদি আপনার ভেরিয়েবলের জন্য একটি মান নির্ধারণ করেন তবে এটি ডিফল্টটি বরাদ্দ করবে না। এটি yaml.v2 লাইব্রেরির সাথে বেশ ভাল কাজ করে।
নর্ডেস

3

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
}

-3
type Config struct {
    AWSRegion                               string `default:"us-west-2"`
}

1
এটি ভুল। সর্বোপরি, আপনি সেই ক্ষেত্রে একটি ট্যাগ মান সেট করতে পারেন এবং তার পরে প্রতিফলনের সাথে তার মানটি পেতে পারেন তবে এটির সাহায্যে বাক্য গঠনটিও ভুল (ব্যাক টিকগুলি অনুপস্থিত) রয়েছে এবং আপনি কেবল স্ট্রিং টাইপের জন্য একটি ডিফল্ট মান সেট করতে সক্ষম হবেন। যদি এই উদাহরণটি বিশেষভাবে উল্লেখ করছে সে সম্পর্কে আপনার যদি কিছু অন্তর্দৃষ্টি থাকে তবে দয়া করে উল্লেখ করার জন্য একটি লিঙ্ক যুক্ত করুন।
মার্কেসিলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.