ফাংশন ডিক্লেয়ারেশন সিনট্যাক্স: ফাংশন নামের আগে প্রথম বন্ধনীতে জিনিস


248

আমি দুঃখিত আমি প্রশ্নের শিরোনামে আরও নির্দিষ্ট হতে পারি না, তবে আমি কিছু গো কোড পড়ছিলাম এবং এই ফর্মটির ফাংশন ঘোষণার মুখোমুখি হয়েছিলাম:

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    ...
}

https://github.com/mattermost/platform/blob/master/api/context.go থেকে

func (s *GracefulServer) BlockingClose() bool {
    ...
}

https://github.com/braintree/manners/blob/master/server.go থেকে

কি (h handler)এবং (s *GracefulServer)বন্ধনী মানে মধ্যে? প্রথম কার্যকারিতা ঘোষণার অর্থ কী, বন্ধুত্বের মধ্যে থাকা জিনিসগুলির অর্থ বিবেচনায় নেওয়া?

সম্পাদন করা

এটি কী ফাংশন এবং পদ্ধতিগুলির পার্থক্যের কোনও সদৃশ নয় ? : এই প্রশ্নটি আমার কাছে এলো কারণ আমি জানতাম না যে ফাংশনের নামের আগে প্রথম বন্ধনীর জিনিসগুলি কী ছিল, কারণ আমি ভাবিনি যে কার্য এবং পদ্ধতির মধ্যে কী পার্থক্য ছিল ... যদি আমি জানতাম যে এই ঘোষণাটি একটি পদ্ধতি যে আমি চাই না ' টি প্রথম প্রশ্নে এই প্রশ্ন ছিল। যদি কারও একদিন আমার মতো একই সন্দেহ থাকে তবে আমি বিশ্বাস করি না যে সে "গোলং পদ্ধতিগুলি" অনুসন্ধান করতে যাবে কারণ তিনি জানেন না যে এই ঘটনাটি। গাণিতিক প্রকাশের আগে "সিগমা" অক্ষরটির অর্থ কী তা বোঝার মতো হবে (এটি না জেনে বোঝার অর্থ সংক্ষেপণ) এবং কেউ বলে যে এটি সংক্ষেপ এবং অন্য কোনও জিনিসের মধ্যে পার্থক্য কী তা তার একটি সদৃশ।

এছাড়াও, এই প্রশ্নের সংক্ষিপ্ত উত্তর ("এটি একটি রিসিভার") "ফাংশন এবং পদ্ধতিগুলির মধ্যে পার্থক্য কী" এর কোনও উত্তর নয়।


27
@ ভোলকার তারপরে অস্বীকৃতি জানিয়ে বলেছেন যে স্ট্যাকওভারফ্লোতে থাকা গো লোকেরা কেবলমাত্র এমন প্রশ্নের উত্তর দেয় যা ট্যুর অফ গ-এ নেই। হাস্কেল সম্প্রদায়ের লোকেরা হাসকেলের তালিকা থেকে আমি কীভাবে nউপাদান পেতে পারি তার মতো প্রশ্ন জিজ্ঞাসা করতে পারে ? , যা আপনাকে গ্রেট গুডের জন্য একটি হাস্কেল শিখুন এবং এর সম্পর্কে কোনও ঝগড়া না করেই তাদের প্রশ্নের উত্তর পান এর পরিচিতিতে রয়েছে।
মার্কাস ভিনসিয়াস মন্টেইরো

23
আমার যখন এই প্রশ্নটি হয়েছিল তখন আমি প্রথমে গো ভ্রমণে যাই। আমি সমস্ত "ফাংশন" শিরোনাম পরীক্ষা করেছি এবং উদাহরণগুলির মধ্যে এটির কোনও কিছুই আচ্ছাদিত হয়নি। ট্যুর.আলংআর.অর্গ.আবাসিকস / ৪ ট্যুর.আলংআরআর.জি. / বেসিকস / আপনি যদি পদ্ধতি এবং ইন্টারফেসগুলি প্রসারিত করতে না জানেন তবে আপনি "পদ্ধতিগুলি কার্যকারিতা" শিরোনামটি দেখতে পাবেন না। এই প্রশ্নটি গুগল সূচকের জন্য বৈধ এবং দুর্দান্ত। সদৃশ পতাকা জেলিটগুলি হালকা করা দরকার।
ব্রুনো ব্রোনোস্কি

14
আপনার প্রশ্নে সুনির্দিষ্ট না হওয়ার জন্য ধন্যবাদ, কারণ উত্তরটি আমাকে খুঁজে পেতে সহায়তা করার পক্ষে এটি যথেষ্ট ছিল!
ডেভিড কে

1
আমি যা অনুসন্ধান করেছি ঠিক তা জিজ্ঞাসা করেছি, এটি একটি বৈধ প্রশ্ন। ধন্যবাদ. আমি সমস্ত ধরণের ফাংশন সংজ্ঞা পড়েছি এবং এটির ব্যাখ্যা কেউ দেয় নি। আমি এখনও আমার ন্যূব প্রশ্নটি লেখার চেষ্টা করেছি এবং এটি পেয়েছি।
আজাক 6

উত্তর:


199

একে বলা হয় 'রিসিভার'। প্রথম ক্ষেত্রে (h handler)এটি একটি মান প্রকার, দ্বিতীয়টিতে (s *GracefulServer)এটি একটি পয়েন্টার। এই গোতে যেভাবে কাজ করে তা অন্য কয়েকটি ভাষার থেকে কিছুটা আলাদা হতে পারে। প্রাপ্তি প্রকারটি, বেশিরভাগ অবজেক্ট-ভিত্তিক প্রোগ্রামিংয়ে ক্লাসের মতো কমবেশি কাজ করে। আপনি যে পদ্ধতিটি কল করেছেন এটি এটি, যেমন আমি যদি Aকিছু ক্লাসের পাশে কিছু পদ্ধতি Personরাখি তবে Personফোন করার জন্য আমার টাইপের একটি উদাহরণের প্রয়োজন হবে A(ধরে নিবেন এটি একটি উদাহরণ পদ্ধতি এবং স্থির নয়!)।

এখানে একটি গ্যাচা হ'ল রিসিভার কলটি স্ট্যাকের উপর অন্যান্য আর্গুমেন্টের মতো চাপ দেয় তাই যদি রিসিভারটি একটি মান ধরণের হয় তবে এর মতো আপনি যদি handlerসেই পদ্ধতিটির অর্থ হিসাবে যা পদ্ধতিটি বলেছিলেন তার অনুলিপিটিতে কাজ করবে h.Name = "Evan"would আপনি কলিং স্কোপে ফিরে যাওয়ার পরে অবিচল থাকবেন না। এই কারণে রিসিভারের অবস্থার পরিবর্তনের প্রত্যাশা করে এমন কোনও কিছুর জন্য একটি পয়েন্টার ব্যবহার করতে হবে বা সংশোধিত মানটি ফিরিয়ে আনতে হবে (যদি আপনি এটির সন্ধান করছেন তবে একটি অপরিবর্তনীয় ধরণের দৃষ্টান্ত আরও দেয়)।

এখানে অনুমান থেকে প্রাসঙ্গিক বিভাগ; https://golang.org/ref/spec#Method_sets


6
প্রাসঙ্গিক
বৈশিষ্টের

4
গোলাং ট্যুরের বেশ কয়েকটি দরকারী উদাহরণও রয়েছে ট্যুর.আলংআরএক্স.আর
স্মিথস

90

এর অর্থ ServeHTTPএকটি স্বতন্ত্র ফাংশন নয়। ফাংশন নামের পূর্বে প্রথম বন্ধনী হ'ল এই ফাংশনগুলি পরিচালনা করবে এমন কোনও বস্তুর সংজ্ঞা দেওয়ার গো উপায়। সুতরাং, মূলত ServeHTTPহ্যান্ডলার টাইপ করার একটি পদ্ধতি এবং হ্যান্ডলার টাইপ যেকোনও অবজেক্ট ব্যবহার করে আহ্বান করা যেতে পারে।

h.ServeHTTP(w, r)

এগুলিকে রিসিভারও বলা হয়। তাদের সংজ্ঞা দেওয়ার দুটি উপায় রয়েছে are আপনি যদি রিসিভারটি পরিবর্তন করতে চান তবে পয়েন্টার ব্যবহার করুন:

func (s *MyStruct) pointerMethod() { } // method on pointer

আপনি যদি রিসিভারটি পরিবর্তন করতে চান না তবে আপনি রিসিভারকে একটি মান হিসাবে সংজ্ঞা দিতে পারেন:

func (s MyStruct)  valueMethod()   { } // method on value

গো খেলার মাঠের এই উদাহরণটি ধারণাটি প্রমাণ করে।

package main

import "fmt"

type Mutatable struct {
    a int
    b int
}

func (m Mutatable) StayTheSame() {
    m.a = 5
    m.b = 7
}

func (m *Mutatable) Mutate() {
    m.a = 5
    m.b = 7
}

func main() {
    m := &Mutatable{0, 0}
    fmt.Println(m)
    m.StayTheSame()
    fmt.Println(m)
    m.Mutate()
    fmt.Println(m)

উপরের প্রোগ্রামটির আউটপুটটি হ'ল:

&{0 0}
&{0 0}
&{5 7}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.