ماڈیول اسباق (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غلطیوں کے لیے۔ctxبرائےcontext.Context۔- میتھڈ ریسیورز: پوری قسم میں 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 کوششوں کے بعد حل دستیاب ہے۔
Inverti la visibilità: rendi Username esportato (maiuscolo) e پاس ورڈ privato (minuscolo)۔
3 کوششوں کے بعد حل دستیاب ہے۔
Quale di questi nomi è idiomatico in Go per un tipo esportato 'server HTTP'؟
type ??? struct {}