মডিউল পাঠ (1/5)
নামকরণের রীতি এবং শৈলী
Go-এর শক্তিশালী এবং আলোচনাযোগ্য নামকরণ এবং শৈলীর নিয়ম রয়েছে: অফিসিয়াল ফর্ম্যাটার gofmt (এবং এর সুপারসেট goimports) ইন্ডেন্টেশন, স্পেসিং এবং আমদানি ক্রম নির্ধারণ করে। আলোচনার স্টাইল অফ-টপিক হিসাবে বিবেচিত হয়: আপনি gofmt -w চালান এবং এগিয়ে যান। এটি আরও আকর্ষণীয় সমস্যার জন্য শক্তি মুক্ত করে।
দৃশ্যমানতা: বড় হাতের বা ছোট হাতের অক্ষর
কোন public/private কীওয়ার্ড নেই। নামের প্রথম অক্ষর দৃশ্যমানতা নির্ধারণ করে:
- বড় হাতের → প্যাকেজের বাইরে রপ্তানি করা হয়েছে (
User,Login,MaxRetries)। - ছোট হাতের → প্যাকেজের জন্য ব্যক্তিগত (
user,parseLine,defaultTimeout)।
এটি প্রযোজ্য: প্রকার, ফাংশন, পদ্ধতি, ভেরিয়েবল, ধ্রুবক, কাঠামো ক্ষেত্র।
type User struct {
Name string // exported
email string // private to the package
}একটি "ব্যক্তিগত" কাঠামো ক্ষেত্র ** encoding/json দ্বারা ক্রমানুযায়ী ** নয় (মডিউল 8 দেখুন), এবং এটি pkg_test-এর পরীক্ষা থেকে অ্যাক্সেসযোগ্য নয়৷
ক্যামেলকেস, কখনই সাপের_কেস নয়
বহু-শব্দের নামে কোনো আন্ডারস্কোর নেই:
- ✅
HTTPClient,userName,parseRequest - ❌
Http_Client,user_name,parse_request
সংক্ষিপ্ত শব্দগুলি সমস্ত বড় হাতের হয় (বা সমস্ত ছোট হাতের, যদি ব্যক্তিগত সুযোগে থাকে):
- ✅
URL,ID,HTML,JSON,parseURL,userID - ❌
Url,Id,Html,Json,parseUrl,userId
type APIResponse struct {
UserID int
HTMLURL string
}সংক্ষিপ্ত সুযোগের জন্য সংক্ষিপ্ত নাম
সংকীর্ণ সুযোগে সমান স্বচ্ছতার সাথে সংক্ষিপ্ততা পছন্দ করুন:
// idiomatic
for i, v := range items { ... }
for k, v := range m { ... }
if err := f(); err != nil { ... }
func (s *Server) Serve(w http.ResponseWriter, r *http.Request) { ... }প্রতিষ্ঠিত কনভেনশন:
- লুপ সূচকের জন্য
i, j, k। - মানগুলির জন্য
v, কীগুলির জন্যk৷ rএর জন্য*Request/io.Reader,wএর জন্যWriter/ResponseWriter।- ত্রুটির জন্য
err context.Contextএর জন্যctx।- পদ্ধতি রিসিভার: সমগ্র ধরন জুড়ে 1-2টি সামঞ্জস্যপূর্ণ অক্ষর (
s *Server,u *User)। কখনোইthisবাself।
ব্যাপ্তি যত বিস্তৃত হবে, নামটি তত বেশি বর্ণনামূলক হতে হবে: একটি স্থানীয় count ঠিক আছে, কিন্তু একটি রপ্তানি করা Count ভেরিয়েবল আপনাকে বলতে হবে এটি কী গণনা করে৷
ইন্টারফেসে "I" উপসর্গ নেই, "Impl" প্রত্যয় নেই
// idiomatic
type Reader interface { ... }
type fileReader struct { ... } // concrete implementation
// not idiomatic
type IReader interface { ... }
type ReaderImpl struct { ... }ছোট ইন্টারফেসগুলি প্রায়ই -er প্রত্যয় গ্রহণ করে: Reader, Writer, Stringer, Closer। এটি এই সত্যের প্রতিধ্বনি করে যে তারা একটি আচরণ (একটি পদ্ধতি, আদর্শভাবে) বর্ণনা করে।
প্যাকেজের নাম
একটি প্যাকেজের একটি নাম, সংক্ষিপ্ত, সব ছোট হাতের, কোন আন্ডারস্কোর নেই:
- ✅
bytes,http,os,userauth - ❌
userAuth,user_auth,UserAuth
প্যাকেজের নাম হল এর চিহ্নগুলির ব্যবহার উপসর্গ: bytes.Buffer, http.Client। তাই user.User অপ্রয়োজনীয়: প্রকার (user.Account) বা প্যাকেজের নাম পরিবর্তন করা ভালো।
gofmt বিতর্কের জন্য প্রস্তুত নয়৷
gofmt প্রয়োগ করে:
- ট্যাব সহ ইন্ডেন্টেশন (স্পেস নয়)।
- স্বাক্ষরের মতো একই লাইনে ব্রেস
{। - একটি ফাঁকা লাইন দ্বারা পৃথক গ্রুপে আমদানি;
goimportsএছাড়াও অনুপস্থিত আমদানি যোগ করে। - অপারেটরদের চারপাশে স্থান।
প্রতিশ্রুতি দেওয়ার আগে সর্বদা দৌড়ান:
go fmt ./...
goimports -w .
go vet ./...লিন্টার (staticcheck, golangci-lint) অতিরিক্ত নিয়ম যোগ করে (অব্যবহৃত ভেরিয়েবল, ছায়া, অকেজো তুলনা, ...)।
ব্যায়াম
Rinomina la struct Http_Client in HTTPClient (e il campo Url in URL) seguendo le convenzioni go sugli acronimi.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ইনভার্টি লা ভিসিবিলিটি: রেন্ডি ইউজারনেম esportato (maiuscolo) এবং পাসওয়ার্ড প্রাইভেটো (মাইনসকোলো)।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
'সার্ভার এইচটিটিপি'-এর জন্য গো-প্রচারের জন্য কোন প্রশ্ন আছে?
type ??? struct {}