যেতে কি optionচ্ছিক পরামিতি থাকতে পারে? অথবা আমি একই নাম এবং বিভিন্ন সংখ্যক যুক্তি দিয়ে দুটি ফাংশন সংজ্ঞায়িত করতে পারি?
যেতে কি optionচ্ছিক পরামিতি থাকতে পারে? অথবা আমি একই নাম এবং বিভিন্ন সংখ্যক যুক্তি দিয়ে দুটি ফাংশন সংজ্ঞায়িত করতে পারি?
উত্তর:
গোয়ের alচ্ছিক পরামিতি নেই বা এটি পদ্ধতি ওভারলোডিং সমর্থন করে না :
টাইপ ম্যাচিং পাশাপাশি করার প্রয়োজন না হলে পদ্ধতি প্রেরণাকে সহজ করা হয়। অন্যান্য ভাষার অভিজ্ঞতা আমাদের বলেছিল যে একই নামের সাথে বিভিন্ন পদ্ধতি রয়েছে তবে বিভিন্ন স্বাক্ষর মাঝে মাঝে দরকারী ছিল তবে এটি ব্যবহারে বিভ্রান্তিকর এবং ভঙ্গুরও হতে পারে। কেবল নাম অনুসারে মিলে যাওয়া এবং ধরণের ধরণের ধারাবাহিকতার প্রয়োজন গো-এর টাইপ সিস্টেমে একটি সহজ সরল সিদ্ধান্ত ছিল।
make
একটি বিশেষ ক্ষেত্রে তারপর? বা এটি কি সত্যই কোনও কার্য হিসাবে প্রয়োগ করা হয়নি ...
make
একটি ভাষা নির্মাণ এবং উপরে বর্ণিত বিধিগুলি প্রয়োগ হয় না। দেখুন এই সংশ্লিষ্ট প্রশ্ন ।
range
একই কেস হিসাবে make
, যে অর্থে
Paraচ্ছিক প্যারামিটারগুলির মতো কিছু অর্জনের একটি দুর্দান্ত উপায় হ'ল ভেরিয়াদিক আরোগুলি ব্যবহার করা। ফাংশনটি আসলে আপনি যা নির্দিষ্ট বলুন তার স্লাইস পাবেন receives
func foo(params ...int) {
fmt.Println(len(params))
}
func main() {
foo()
foo(1)
foo(1,2,3)
}
params
আপনি এমন একটি কাঠামো ব্যবহার করতে পারেন যার মধ্যে পরামিতিগুলি রয়েছে:
type Params struct {
a, b, c int
}
func doIt(p Params) int {
return p.a + p.b + p.c
}
// you can call it without specifying all parameters
doIt(Params{a: 1, c: 9})
অবাধ, ঐচ্ছিক প্যারামিটার সম্ভাব্য সংখ্যক, একটি চমৎকার বাগ্ধারা ব্যবহার করা ক্রিয়াগত অপশন ।
আপনার ধরণের জন্য Foobar
, প্রথমে কেবলমাত্র একজন নির্মাতা লিখুন:
func NewFoobar(options ...func(*Foobar) error) (*Foobar, error){
fb := &Foobar{}
// ... (write initializations with default values)...
for _, op := range options{
err := op(fb)
if err != nil {
return nil, err
}
}
return fb, nil
}
যেখানে প্রতিটি বিকল্প একটি ফাংশন যা ফুবারকে পরিবর্তন করে। তারপরে আপনার ব্যবহারকারীর মানক বিকল্পগুলি ব্যবহার বা তৈরি করার জন্য সুবিধাজনক উপায় সরবরাহ করুন, উদাহরণস্বরূপ:
func OptionReadonlyFlag(fb *Foobar) error {
fb.mutable = false
return nil
}
func OptionTemperature(t Celsius) func(*Foobar) error {
return func(fb *Foobar) error {
fb.temperature = t
return nil
}
}
সংক্ষিপ্ততার জন্য, আপনি বিকল্পগুলির ( খেলার মাঠ ) ধরণের নাম দিতে পারেন :
type OptionFoobar func(*Foobar) error
আপনার যদি বাধ্যতামূলক প্যারামিটারগুলির প্রয়োজন হয় তবে এগুলি বৈচিত্রের আগে নির্মাণকারীর প্রথম যুক্তি হিসাবে যুক্ত করুন options
।
কার্যকরী বিকল্পগুলির মূল উপকারগুলি হ'ল:
এই কৌশলটি রব পাইক দ্বারা তৈরি করা হয়েছিল এবং ডেভ চেনিও প্রদর্শন করেছিলেন ।
func()
যদি প্রয়োজন হয় তবে এটি প্রয়োজনের চেয়ে আমার মস্তিষ্ককে বাঁকিয়ে দেয়। যখনই আমাকে এই পদ্ধতির ব্যবহার করতে হবে, যেমন ইকো লাইব্রেরির সাথে, আমি দেখতে পাই আমার মস্তিষ্ক বিমূর্ততার খরগোশের গর্তে আটকা পড়েছে। #fww
Go এ itherচ্ছিক পরামিতি বা ফাংশন ওভারলোডিং সমর্থিত নয়। গো প্যারামিটারগুলির একটি পরিবর্তনশীল সংখ্যাকে সমর্থন করে: আর্গুমেন্টগুলিকে ... পরামিতিগুলিতে পাস করছে
না - না। সি ++ প্রোগ্রামার ডক্সের জন্য গো প্রতি
গো ফাংশন ওভারলোডিং সমর্থন করে না এবং ব্যবহারকারী সংজ্ঞায়িত অপারেটরদের সমর্থন করে না।
Anচ্ছিক পরামিতিগুলি অসমর্থিত, তবে সেগুলিও সমর্থিত নয় equally
আপনি নীচের মত অনুরূপ একটি চমত্কার এ বেশ সুন্দরভাবে encapsulate করতে পারেন।
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println(prompt())
}
func prompt(params ...string) string {
prompt := ": "
if len(params) > 0 {
prompt = params[0]
}
reader := bufio.NewReader(os.Stdin)
fmt.Print(prompt)
text, _ := reader.ReadString('\n')
return text
}
এই উদাহরণে, পূর্বনির্ধারিতভাবে প্রম্পটের একটি কোলন এবং এর সামনে একটি স্থান থাকে। । ।
:
। । । তবে আপনি প্রম্পট ফাংশনে একটি প্যারামিটার সরবরাহ করে সেটি ওভাররাইড করতে পারেন।
prompt("Input here -> ")
এটি নীচের মত একটি অনুরোধে ফলাফল হবে।
Input here ->
আমি প্যারাম এবং ভেরিয়াদিক আরোগুলির কাঠামোর সংমিশ্রণটি ব্যবহার করে শেষ করেছি। এইভাবে, আমাকে বিদ্যমান ইন্টারফেসটি পরিবর্তন করতে হয়নি যা বেশ কয়েকটি পরিষেবা দ্বারা গ্রাস করা হয়েছিল এবং আমার পরিষেবাটি প্রয়োজনীয় হিসাবে অতিরিক্ত প্যারামগুলি পাস করতে সক্ষম হয়েছিল। গোলাং খেলার মাঠে নমুনা কোড: https://play.golang.org/p/G668FA97Nu
আমি কিছুটা দেরি করেছি, তবে আপনি যদি সাবলীল ইন্টারফেস পছন্দ করেন তবে আপনি সম্ভবত এইভাবে শিকলযুক্ত কলগুলির জন্য আপনার সেটারগুলি ডিজাইন করতে পারেন:
type myType struct {
s string
a, b int
}
func New(s string, err *error) *myType {
if s == "" {
*err = errors.New(
"Mandatory argument `s` must not be empty!")
}
return &myType{s: s}
}
func (this *myType) setA (a int, err *error) *myType {
if *err == nil {
if a == 42 {
*err = errors.New("42 is not the answer!")
} else {
this.a = a
}
}
return this
}
func (this *myType) setB (b int, _ *error) *myType {
this.b = b
return this
}
এবং তারপরে এটিকে কল করুন:
func main() {
var err error = nil
instance :=
New("hello", &err).
setA(1, &err).
setB(2, &err)
if err != nil {
fmt.Println("Failed: ", err)
} else {
fmt.Println(instance)
}
}
এটি @ রিপোনেট উত্তরে উপস্থাপিত ফাংশনাল অপশনগুলির সাথে সমান এবং একই সুবিধাগুলি উপভোগ করে তবে কিছু অসুবিধা রয়েছে:
err
ভেরিয়েবল ঘোষণা করে এটি শূন্য করতে একটি লাইন ব্যয় করতে হবে।তবে, একটি ছোট ছোট সুবিধা রয়েছে, এই ধরণের ফাংশন কলগুলি ইনপেলারের জন্য ইনলাইন করা সহজ হওয়া উচিত তবে আমি সত্যিই বিশেষজ্ঞ নই।
আপনি একটি মানচিত্র দিয়ে নির্বিচারে নামকরণ পরামিতি পাস করতে পারেন।
type varArgs map[string]interface{}
func myFunc(args varArgs) {
arg1 := "default" // optional default value
if val, ok := args["arg1"]; ok {
// value override or other action
arg1 = val.(string) // runtime panic if wrong type
}
arg2 := 123 // optional default value
if val, ok := args["arg2"]; ok {
// value override or other action
arg2 = val.(int) // runtime panic if wrong type
}
fmt.Println(arg1, arg2)
}
func Test_test() {
myFunc(varArgs{"arg1": "value", "arg2": 1234})
}
অন্য সম্ভাবনা হ'ল একটি ক্ষেত্র সহ এমন একটি কাঠামো ব্যবহার করা যা এটি বৈধ কিনা তা নির্দেশ করতে to স্কুল থেকে নাল ধরন যেমন নুলস্ট্রিং সুবিধাজনক। আপনার নিজের ধরণটি সংজ্ঞায়িত না করা ভাল, তবে আপনার যদি কাস্টম ডেটা টাইপের প্রয়োজন হয় তবে আপনি সর্বদা একই প্যাটার্নটি অনুসরণ করতে পারেন। আমি মনে করি theচ্ছিক নেসটি ফাংশন সংজ্ঞা থেকে পরিষ্কার এবং এখানে ন্যূনতম অতিরিক্ত কোড বা প্রচেষ্টা রয়েছে।
উদাহরণ হিসাবে:
func Foo(bar string, baz sql.NullString){
if !baz.Valid {
baz.String = "defaultValue"
}
// the rest of the implementation
}