অত্যন্ত দীর্ঘ লাইন থেকে বিরতি নিতে

পাঠকদেরকে হরিজন্টালি স্ক্রোল বা দলনানকরণ না করতে বা দস্তাবেজ প্রসারিত করা না ।

আমরা 99 অক্ষরের লাইন দৈর্ঘ্য সীমিত রাখার সুপারিশ জানাই। লেখকদের এই সীমা পার হওয়ার আগে লাইন ভাঙ্গতে পারেন, তবে এটি একটি কঠিন নিয়ম নয়। কোড এই সীমা ছাড়া যেতে পারে।

সঙ্গতি

এই দস্তাবেজে উল্লেখিত প্রমাণগুলির কিছু ভেদান্তিক বিচার, সমীন, বা প্রসঙ্গে ভিত্তি করে বিবেচনা করা। তাতে অন্যতম গুরুত্বপূর্ণ দিক হলো সঙ্গতিতা রক্ষা করা

সঙ্গতিতা রক্ষা করা মেনে নিয়ে বৃহত্তম ধারনা বজায় রাখা, যেটা রক্ষণীয়, একমাত্র শেখা খরচ তালাবাহ্য, এবং নতুন ব্যাপার উত্থান অথবা ভুল অনুভূতি বা ত্রুটিগুলি ঠিক করার সময়ে মাইগ্রেট, হাল দিয়ে দিয়ে ঠিক করা সুবিধা দেয়।

সাথে, কোড বেষ্ট প্রকল্পে বেশ দীর্ঘ এবং চুরি করা সোজা কোড সংকুচিত শীতল কার্যত পালনের জন্য। ভুল অথবা চিন্তাগুলি, এসব নিয়মিত অবদান প্রভাব ফালায়। এসবের ফলে গতি অছুটে, হাস্য আত্বে, এবং সংখ্যা নিবৃত্তির বেশি সংখ্যক ডাক্কা।

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

পরস্পরের সাদৃশ্য গোষ্ঠীবদ্ধি

গো ভাষা সম্পর্কিত সাদৃশ্য ঘোষণাগুলি সমর্থন করে।

সুপারিশ নয়:

import "a"
import "b"

সুপারিশ:

import (
  "a"
  "b"
)

এটি প্রায়ই ধারনা করে কনস্ট্যান্ট, ভেরিয়েবল এবং ধরন ঘোষণা:

সুপারিশ নয়:

const a = 1
const b = 2

var a = 1
var b = 2

type Area float64
type Volume float64

সুপারিশ:

const (
  a = 1
  b = 2
)

var (
  a = 1
  b = 2
)

type (
  Area float64
  Volume float64
)

মাত্র সাদৃশ্য ঘোষণা একসাথে সম্পর্কিত করে দেওয়া এবং বিপর্যাসিত ঘোষণা সম্পর্কিত ঘোষণা থেকে বিরতি নিতে।

সুপারিশ নয়:

type Operation int

const (
  Add Operation = iota + 1
  Subtract
  Multiply
  EnvVar = "MY_ENV"
)

সুপারিশ:

type Operation int

const (
  Add Operation = iota + 1
  Subtract
  Multiply
)

const EnvVar = "MY_ENV"

এখানে গোছা হয় না যে কোথায় বা কোথায় সাদৃশ্যের ব্যবহার করা উচিত। উদাহরণস্বরূপ, আপনি এগুলিকে ফর্মে ব্যবহার করতে পারেন:

সুপারিশ নয়:

func f() string {
  red := color.New(0xff0000)
  green := color.New(0x00ff00)
  blue := color.New(0x0000ff)

  ...
}

সুপারিশ:

func f() string {
  var (
    red   = color.New(0xff0000)
    green = color.New(0x00ff00)
    blue  = color.New(0x0000ff)
  )

  ...
}

অপশক্তি: যদি ভ্যারিয়েবলের ঘোষণা অন্য ভ্যারিয়েবলদের পাশাপাশি, বিশেষত ফাংশন-স্থানীয় ঘোষণার মধ্যে, তাহলে তারা একসঙ্গে তোলা করতে হবে। বিচারণা করুন যো এটা পাশাপাশি ঘোষণা সম্পর্কিত ভ্যারিয়েবলগুলকে সমতূলভূতভাবে তোলা করতে হবে।

সুপারিশ নয়:

func (c *client) request() {
  caller := c.name
  format := "json"
  timeout := 5*time.Second
  var err error
  // ...
}

সুপারিশ:

func (c *client) request() {
  var (
    caller  = c.name
    format  = "json"
    timeout = 5*time.Second
    err error
  )
  // ...
}

আমদানি গোষ্ঠীবদ্ধকরণ

আমদানি দুটি ক্যাটাগরিতে গোষ্ঠীবদ্ধিত হতে হবে:

  • মানসম্পন্ন লাইব্রেরী
  • অন্যান্য লাইব্রেরী

সাধারণত, এই পরিবেশ গোছা করা হয় goimports দ্বারা।

সুপারিশ নয়:

import (
  "fmt"
  "os"
  "go.uber.org/atomic"
  "golang.org/x/sync/errgroup"
)

সুপারিশ:

import (
  "fmt"
  "os"

  "go.uber.org/atomic"
  "golang.org/x/sync/errgroup"
)

প্যাকেজের নাম

একটি প্যাকেজের নাম নামকরণ করার সময়, দয়া করে এই নিয়মগুলি অনুসরণ করুন:

  • সমস্ত ছোট অক্ষর, কোনও বড় অক্ষর বা আড়বুড়ি না।
  • শব্দায়নে পূর্ণ নামশেষের নাম প্রস্তুত করার বেশিরভাগ ক্ষেত্রে নতুন নাম দরকার হয় না।
  • সংক্ষিপ্ত এবং সংক্ষিপ্ত। মন করুন যে নামটি যে জাগায় ব্যবহৃত হয়, বাস্তবত পূর্ণ সা�

ফাংশন নেমিং

আমরা ফাংশন নেম এ MixedCaps ব্যবহারের গো কমিউনিটি সংগ্রাহী। একটি অস্ত্রোপচারের প্রাপ্তি, যেখানে ফাংশন নামে আন্ডারস্কোর থাকতে পারে, যেমন: TestMyFunction_WhatIsBeingTested এমন: প্রতিসন্ধান সম্পর্কিত টেস্ট কেসগুলির জন্য।

ইম্পোর্ট অ্যালাইয়াস

যদি প্যাকেজের নাম ইম্পোর্ট পথের শেষের উপাদানের সাথে মেল না করে, তাহলে একটি ইম্পোর্ট অ্যালিয়াস ব্যবহার করতে হবে।

import (
  "net/http"

  client "example.com/client-go"
  trace "example.com/trace/v2"
)

সব অন্যান্য ক্ষেত্রে, ইম্পোর্ট অ্যালাইয়াস ব্যবহার একাধিক ইম্পোর্ট মধ্যে লড়াই থাকা না থাকা ব্যাপারে এড়িয়ে যেতে হবে।

প্রস্তাবিত নয়:

import (
  "fmt"
  "os"

  nettrace "golang.net/x/trace"
)

সুপারিশ করা:

import (
  "fmt"
  "os"
  "runtime/trace"

  nettrace "golang.net/x/trace"
)

ফাংশন গ্রুপ এবং ক্রম

  • ফাংশনগুলি প্রায়ই যেহেতু কল করা হয় সে অনুসারে প্রায়ই বাছাই করা উচিত।
  • একই ফাইলের ভিতরে ফাংশনগুলি রিসিভার দ্বারা দায়িত্বশীলতার অনুযায়ী গ্রুপ করা উচিত।

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

newXYZ() / NewXYZ() এমন একটি দৃষ্টান্ত টাইপ সংজ্ঞানার পরে কিন্তু এবারের অবশিষ্ট মেথডের আগে আসতে পারে।

ফাংশনগুলি যখন রিসিভার দ্বারা গ্রুপ করা হয়, সাধারণ ইউটিলিটি ফাংশনগুলি ফাইলের শেষে অবস্থান করা উচিত।

প্রস্তাবিত নয়:

func (s *something) Cost() {
  return calcCost(s.weights)
}

type something struct{ ... }

func calcCost(n []int) int {...}

func (s *something) Stop() {...}

func newSomething() *something {
    return &something{}
}

সুপারিশ করা:

type something struct{ ... }

func newSomething() *something {
    return &something{}
}

func (s *something) Cost() {
  return calcCost(s.weights)
}

func (s *something) Stop() {...}

func calcCost(n []int) int {...}

পাটিকা কমানো

কোডটি একটি উচিত স্তরে পৌঁছানোর জন্য ত্রুটি / বিশেষ মামলা যত শীঘ্রই হ্যান্ডেল করে এবং বা প্রত্যাখ্যান যেতে পারে। অপেক্ষা কোনও উঁচু নেস্টিংয় বহিঃ মাধ্যমে বহু স্তরে কোডার পরিমাণকে কমিয়ে যাওয়া যেতে।

প্রস্তাবিত নয়:

for _, v := range data {
  if v.F1 == 1 {
    v = process(v)
    if err := v.Call(); err == nil {
      v.Send()
    } else {
      return err
    }
  } else {
    log.Printf("Invalid v: %v", v)
  }
}

সুপারিশ করা:

for _, v := range data {
  if v.F1 != 1 {
    log.Printf("Invalid v: %v", v)
    continue
  }

  v = process(v)
  if err := v.Call(); err != nil {
    return err
  }
  v.Send()
}

অপ্রয়োজনীয় অন্যান্য

যদি একটি ভেরিয়েবল একটি ইফ এর উভয় শাখার ভিত্তিতে সেট করা হয়, তবে এটি একটি চিহ্নিত ইফ বক্স দ্বারা প্রতিস্থাপিত করা যেতে পারে।

প্রস্তাবিত নয়:

var a int
if b {
  a = 100
} else {
  a = 10
}

সুপারিশ করা:

a := 10
if b {
  a = 100
}

শীর্ষ-স্তরে ভেরিয়েবল ঘোষণা

শীর্ষ স্তরে, স্ট্যান্ডার্ড var কীওয়ার্ড ব্যবহার করুন। এক্সপ্রেশনের ধরণ বিরতি না থাকলে, ধরনটি সুনির্দিষ্ট হলেও বিশেষত উল্লেখ করা উচিত নয়।

প্রস্তাবিত নয়:

var _s string = F()

func F() string { return "A" }

সুপারিশ করা:

var _s = F()
// যেহেতু F স্পষ্টভাবে একটি স্ট্রিং টাইপ ফিরে, তাই আমরা স্পষ্টভাবে _s এর ধরণ উল্লিখ করতে দরকার নেই

func F() string { return "A" }

যদি এটি বিবাদ বা প্রকার প্রদর্শনের টাইপ বিভিন্ন হয় তবে স্পষ্টভাবে ধরনটি উল্লেখ করুন।

type myError struct{}

func (myError) Error() string { return "error" }

func F() myError { return myError{} }

var _e error = F()
// F একটি myError টাইপ এর একটি ইনস্ট্যান্স ফিরে, কিন্তু আমাদের এরর টাইপ প্রয়োজন

প্রশীর্ষ মানের জন্য '_' ব্যবহার করুন

অপ্রকাশিত শীর্ষ-স্তরের vars এবং consts এর জন্য, যখন ব্যবহার করা হবে তখন তাদের সাথে _ ব্যাখ্যা দেয়া যাবে যেটা পূর্ববর্তীর গ্লোবাল নেগেচের অবস্থা সূচয়ন করবে।

মৌলিক কারণ: শীর্ষ-স্তরের চরিত্রগুলি এবং ধ্রুবকগুলির ফেবেকেজ স্তর থাকে। সাধারণ নামগুলি ব্যবহার করা অন্যান্য ফাইলগুলিতে একটি ভুল মানে ব্যবহার করা সহজভাবে হতে পারে।

প্রশাসিত নয়:

// foo.go

const (
  defaultPort = 8080
  defaultUser = "user"
)

// bar.go

func Bar() {
  defaultPort := 9090
  ...
  fmt.Println("Default port", defaultPort)

  // আমরা যদি প্রথম লাইন বাদ দিয়ে দেখি তবে আমি কোম্পাইল ত্রুটি দেখবো না।
}

প্রস্তাবিত:

// foo.go

const (
  _defaultPort = 8080
  _defaultUser = "user"
)

অপশ্ন: বিনিয়োগ পথের ভুল মানগুলি err প্রিফিক্স ছাড়তে পারে। ত্রুটির নামকরণ দেখুন।

স্ট্রাক্টে এম্বেডিং

এম্বেড টাইপ (যেমন: mutex) টাইপ প্রস্তুতির স্ত্রুক্তীর আয়তনের উপরে রাখা উচিত এবং এম্বেডেড ক্ষেত্রের সাধারণ ক্ষেত্রগুলি থেকে খালি লাইন থাকা আবশ্যক।

প্রস্তাবিত নয়:

type Client struct {
  version int
  http.Client
}

প্রস্তাবিত:

type Client struct {
  http.Client

  version int
}

এম্বেডিং যে কোনও ধরণের প্রয়োজনীয় সুবিধা সরবরাহ করা উচিত, এমন যেমন সাংকেতিকভাবে কোনও ফাংশনালিটি যুক্ত বা সংজ্ঞানাত্মকভাবে কোনও পরিপ্রেরক ব্যবহার না করে। এটি ব্যবহার করা উচিত যেভাবে যেন ব্যবহারকারীর উপর কোনও মন্দ প্রভাব না পড়ে। (আরো দেখুন: পাবলিক স্ট্রাক্টে টাইপে টাইপ এম্বেড করার অনুরোধ)

অপশন: ভুল মূল্য মিউটেক্স কে এম্বেডেড ফিল্ড হিসেবে ব্যবহার করা হবে না। আরও দেখুন: শূন্য মানে মিউটেক্স বৈধ।

এম্বেডিং না করা উচিত:

  • শুধুমাত্র সৌন্দর্য বা সুবিধার জন্য বিদায়।
  • বাহ্যিকভাবে বাহিরের টাইপ গুলির নির্মাণ বা ব্যবহারকে আরও কঠিন করা।
  • বাহ্যিকভাবে বাহ্যিক টাইপের শূন্য মানের প্রতিনিধি। যদি শূন্য মান কোনও দরকারী মান থাকে, তবে আবার ইনার টাইপ এম্বেড করার পরেও একটি দরকারী শূন্য মান থাকা উচিত।
  • আপ্রসঙ্গিকভাবে এম্বেড ইনার টাইপ থেকে অসহযোগ কোনও ফাংশন বা ক্ষেত্রগুলি উদ্ঘাটিত করে না।
  • অপ্রকাশিত টাইপ গুলি উদ্ঘাটিত করে না।
  • অথবা বাহ্যিকের প্রতিলিপির ধরণ পরিবর্তন করে না।
  • ইনার টাইপ অপ্রমাণ্য ফর্মে এম্বেড করা না।
  • বাহ্যিক টাইপের ইমপ্লিমেন্টেশনের বিবরণ উদ্ঘাটিত করে না।
  • ব্যবহারকারীদের অভ্যন্তরীণ প্রকার দেখানোর অথবা নিয়ন্ত্রণ করার বিপরীত উস্কানি করে না।
  • বাহ্যিক টাইপের অভ্যন্তরের ফাংশনগুলির সাধারণ আচরণকে আশ্চর্য করা করা না।

সংক্ষেপে, সচেতন এবং উদ্দেশ্যমূলকভাবে এম্বেড করুন। একটি ভালো ভাবনার পরীক্ষা হল, "আমি কি এই ইনার টাইপের সমস্ত নির্যাতন্ত্রিত ফাংশন/ক্ষেত্র সরাসরি বাহ্যিক টাইপে যোগ করা?" যদি উত্তর 'কিছু' বা 'না' হয়, তবে ইনার টাইপ এম্বেড না করুন - পরিস্থিতিতে ফিল্ড ব্যবহার করুন।

প্রস্তাবিত নয়:

type A struct {
    // খুব: A.Lock() এবং A.Unlock() এবার উপলভ্য
    // কোনও ফাংশনাল উপকার প্রদান করে না এবং ব্যবহারকারীকে A এর অভ্যন্তরীণ বিবরণ নিয়ন্ত্রণ করার সুযোগ দেয়।
    sync.Mutex
}

প্রস্তাবিত:

type countingWriteCloser struct {
    // ভালO: Write() বাহ্যিক স্তরের জন্য বিশেষ উদ্দেশ্যে প্রদান করা হয়
    // এবং কাজটি ইনার টাইপের Write() কার্য চালিয়ে দেয়।
    io.WriteCloser
    count int
}
func (w *countingWriteCloser) Write(bs []byte) (int, error) {
    w.count += len(bs)
    return w.WriteCloser.Write(bs)
}

স্থানীয় চরমগুলির ঘোষণা

যদি একটি চর প্রস্তুতির একটি মানে প্রস্তুতি করা হয়, তবে ছোট চর প্রস্তুতির ফর্ম (:=) ব্যবহার করা উচিত।

প্রস্তাবিত নয়:

var s = "foo"

প্রস্তাবিত:

s := "foo"

তবে, কিছু ক্ষেত্রে, ডিফল্ট মানের জন্য var শব্দ ব্যবহার করা পরিষ্কার হতে পারে।

প্রস্তাবিত নয়:

func f(list []int) {
  filtered := []int{}
  for _, v := range list {
    if v > 10 {
      filtered = append(filtered, v)
    }
  }
}

প্রস্তাবিত:

func f(list []int) {
  var filtered []int
  for _, v := range list {
    if v > 10 {
      filtered = append(filtered, v)
    }
  }
}

nil একটি বৈধ স্লাইস

nil একটি দৈর্ঘ্য 0 এর বৈধ স্লাইস, অর্থাৎ:

  • আপনাকে স্পষ্টভাবে 0 দৈর্ঘ্যের একটি স্লাইস ফিরিয়ে দেওয়া উচিত নয়। পরিবর্তনে nil ফিরিয়ে দিন।

অপরাজিত:

if x == "" {
  return []int{}
}

পরামর্শিত:

if x == "" {
  return nil
}
  • স্লাইস খালি কিনা তা চেক করতে, সর্বদা len(s) == 0 ব্যবহার করুন, nil এর পরিবর্তে।

অপরাজিত:

func isEmpty(s []string) bool {
  return s == nil
}

পরামর্শিত:

func isEmpty(s []string) bool {
  return len(s) == 0
}
  • শূন্য মানের স্লাইস (স্লাইস যেহেতু var দিয়ে ঘোষণা করা হয়েছে) প্রাথমিকভাবে make() কল ছাড়াই ব্যবহার করা যায়।

অপরাজিত:

nums := []int{}
// অথবা, nums := make([]int)

if add1 {
  nums = append(nums, 1)
}

if add2 {
  nums = append(nums, 2)
}

পরামর্শিত:

var nums []int

if add1 {
  nums = append(nums, 1)
}

if add2 {
  nums = append(nums, 2)
}

মনে রাখবেন, যেহেতু একটি nil স্লাইস একটি বৈধ স্লাইস, তাই এটি 0 দৈর্ঘ্যের স্লাইসের সমান নয় (একটি nil এবং অন্যটি নয়), এবং তারা বিভিন্ন অবস্থানে (উদাহরণস্বরূপ, কলার সিরিয়ালাইজেশনে) পালন করা হয় এবং তাদেরকে বিভিন্নভাবে পালন করা হতে পারে।

সীমাবদ্ধ ভেরিয়েবল সীমা

যদি সম্ভাব্য হয়, ভেরিয়েবল সীমা সীমা নিয়ে, কেবলই ঘন্টার থোক কমানের নীতির সাথে সংঘর্ষ না করে।

অপরাজিত:

err := os.WriteFile(name, data, 0644)
if err != nil {
 return err
}

পরামর্শিত:

if err := os.WriteFile(name, data, 0644); err != nil {
 return err
}

যদি if বিবৃতির বাইরের ফাংশন কলের ফলাফলটি ব্যবহার করা প্রয়োজন হয়, সীমা কমানোর চেষ্টা করা না চেষ্টা না করবেন।

অপরাজিত:

if data, err := os.ReadFile(name); err == nil {
  err = cfg.Decode(data)
  if err != nil {
    return err
  }

  fmt.Println(cfg)
  return nil
} else {
  return err
}

পরামর্শিত:

data, err := os.ReadFile(name)
if err != nil {
   return err
}

if err := cfg.Decode(data); err != nil {
  return err
}

fmt.Println(cfg)
return nil

শীর্ষ রহিত পিরামিটার এড়াতে

অস্পষ্ট প্যারামিটার ফাংশন কলের পড়ারতে পরিচিতির বিপরীতে ক্ষতি করতে পারে। অবস্থানকের অর্থটা স্পষ্ট না থাকলে, পিরামিটারগুলির উপর C-স্টাইল মন্তব্য ( /* ... */) যুক্ত করুন।

অপরাজিত:

// func printInfo(name string, isLocal, done bool)

printInfo("foo", true, true)

পরামর্শিত:

// func printInfo(name string, isLocal, done bool)

printInfo("foo", true /* isLocal */, true /* done */)

পরিস্থিতিটা উপরের উদাহরণের জন্য, একটি ভাল উপায় হতে পারে ছাড়া আইনী প্রকারের ব্যবহার করা। এর মাধ্যমে, পরিস্থিত ভবিষ্যতে দুই অবস্থান ছাড়া আরও সমর্থন করতে পারে।

type Region int

const (
  UnknownRegion Region = iota
  Local
)

type Status int

const (
  StatusReady Status= iota + 1
  StatusDone
  // শায়দ আমরা ভবিষ্যতে StatusInProgress পাবে।
)

func printInfo(name string, region Region, status Status)

প্রাপাদন করুন

Raw স্ট্রিং লিটারেল ব্যবহার করুন

গো raw string literals এর ব্যবহার সমর্থন করে, যা সংজ্ঞায়িত করে " ' " দ্বারা প্রতীয়ামান স্ট্রিং প্রতিনিধিত্ব করে। যে অবস্থায় মর্ম্মক করা প্রয়োজন, আমরা এই সিদ্ধান্তটি ব্যবহার করতে পারে যাতে নির্মেক সাধারণের দুশ্চিন্তাজনক এস্কেইপড স্ট্রিংগুলিকে প্রতিস্থাপন করা যায়।

এটি একাধিক লাইন আঁকা, এবং উদাহরণার্থে নথিগুলির জন্য উপযোগী। এই অবস্থায়, প্রাধান্য চিনলেদেনউপারের অটুস্সইড স্ট্রিংগুলি ব্যবহারকরা যায়।

অপরাজিত:

wantError := "unknown name:\"test\""

পরামর্শিত:

wantError := `unknown error:"test"`

শীর্ষ রহিত করুন

ফিল্ড নামগুলি ব্যবহার করে স্ট্রাকচার ইনিসিয়ালাইজ করুন

একটি স্ট্রাকচার ইনিসিয়ালাইজ করার সময়, ফিল্ড নামগুলি প্রায়ই উল্লেখ করা উচিত। বর্তমানে এটি go vet দ্বারা প্রয়োগ করা হচ্ছে।

সুপারিশ না করা:

k := User{"John", "Doe", true}

সুপারিশ করা:

k := User{
    FirstName: "John",
    LastName: "Doe",
    Admin: true,
}

অপসারণ: যখন ৩ বা তার কম ফিল্ড থাকে, তখন টেস্ট টেবিলে ফিল্ড নাম অপসারণ করা যেতে পারে।

tests := []struct{
  op Operation
  want string
}{
  {Add, "add"},
  {Subtract, "subtract"},
}

স্ট্রাকচারে শূন্য মানের ফিল্ডগুলি অপসারণ করুন

নামকৃত ফিল্ড সহ স্ট্রাকচার ইনিসিয়ালাইজ করার সময়, যদি প্রাসঙ্গিক সংদর্ভ সরবরাহ না করা হয়, তবে শূন্য মানের ফিল্ডগুলিকে অপসারণ করুন। অর্থাৎ, এগুলি স্বয়ংক্রিয়ভাবে শূন্য মান সেট করুন।

সুপারিশ না করা:

user := User{
  FirstName: "John",
  LastName: "Doe",
  MiddleName: "",
  Admin: false,
}

সুপারিশ করা:

user := User{
  FirstName: "John",
  LastName: "Doe",
}

এটা উপস্থাপন থেকে ডিফল্ট মানের অপসারণের মাধ্যমে পড়ানোর প্রতিবন্ধন করে। কেবল প্রাসঙ্গিক মানগুলি উল্লেখ করুন।

ফিল্ডের নামগুলি সরবরাহ করার যেখানেই সম্ভব, সেখানে ইনিসিয়ালাইজেশনের সময় ম্যাপের ক্ষমতা আকার উল্লেখ করুন, Specifying Map Capacity এটি বিস্তারিত দেখানোর জন্য।

জিরো-মান স্ট্রাকচারের জন্য var ব্যবহার করুন

যদি স্ট্রাকচারের সব ফিল্ড ডিক্লেয়ারেশনে অপেক্ষা করা হয়, তবে স্ট্রাকচারটি ডিক্লেয়ার করতে var ব্যবহার করুন।

সুপারিশ না করা:

user := User{}

সুপারিশ করা:

var user User

এটি শূন্য মান স্ট্রাকচারগুলি প্রতিরোধ করে, ঠিক যেমন আমরা একটি খালি স্লাইস ঘোষণাকরার জন্য পছন্দ করি।

স্ট্রাকচার রেফারেন্স প্রাথমিক করুন

যখন স্ট্রাকচার রেফারেন্স ইনিসিয়ালাইজ করা হয়, স্ট্রাকচার ইনিসিয়ালাইজেশনের জন্য new(T) চালানোর বিপরীতে &T{} ব্যবহার করুন।

সুপারিশ না করা:

sval := T{Name: "foo"}

// অসমান্তরালিত
sptr := new(T)
sptr.Name = "bar"

সুপারিশ করা:

sval := T{Name: "foo"}

sptr := &T{Name: "bar"}

ম্যাপ ইনিসিয়ালাইজ করুন

একটি খালি ম্যাপ এর জন্য, এটি ইনিসিয়ালাইজ করার জন্য make(..) ব্যবহার করুন, এবং ম্যাপটি প্রোগ্রামে পূরণ করুন। এটি ম্যাপ ইনিসিয়ালাইজ করা, এবং এটি প্রস্ছ্ব করে ঘোষণা করা তে বিভিন্ন, এবং এটি পরবর্তীতে সাইজ সম্পর্কিত ইঙ্ক ধরন দিতে সুবিধা সহজতর হয়।

সুপারিশ না করা:

var (
  // m1 is read-write safe;
  // m2 panics when writing
  m1 = map[T1]T2{}
  m2 map[T1]T2
)

সুপারিশ করা:

var (
  // m1 is read-write safe;
  // m2 panics when writing
  m1 = make(map[T1]T2)
  m2 map[T1]T2
)
ঘোষণা এবং ইনিসিয়ালাইজেশন একই সুপারিশন দেখতে ঘোষণা এবং ইনিসিয়ালাইজেশন পরিবর্তন

যখন সম্ভাব্য হয়, ইনিসিয়ালাইজেশনের সময় ম্যাপ ধারায় ম্যাপ মাপ উল্লেখ করুন, বিস্তারিত দেখুন। Specifying Map Capacity

অতএব, যদি ম্যাপটি একটি স্থিত তালিকা অন্তর্ভুক্ত করে, তবে ম্যাপ লিটারাল ব্যবহার করে ম্যাপ ইনিসিয়ালাইজ করুন। সুপারিশ না করা:

m := make(map[T1]T2, 3)
m[k1] = v1
m[k2] = v2
m[k3] = v3

সুপারিশ করা:

m := map[T1]T2{
  k1: v1,
  k2: v2,
  k3: v3,
}

নির্দিষ্ট সেট এর উদাহরন যোগ করার জন্য ম্যাপ লিটারাল ব্যবহার করার মৌলিক নির্দেশিকা। অন্যথায়, make ব্যবহার করুন (এবং যদি সম্ভব হয়, ম্যাপ ক্ষমতা উল্লেখ করুন)।

Printf-Style ফাংশনগুলির জন্য স্ট্রিং ফরম্যাট

যদি আপনি একটি Printf-স্টাইল ফাংশনের ফরম্যাট স্ট্রিংটি বাইরে ফাংশনের বাইরে ঘোষণা করেন, তবে এটি একটি const ধারা হিসেবে সেট করুন।

এটি go vet কে ফরম্যাট স্ট্রিংটিতে স্ট্যাটিক বিশ্লেষণ করার সাহায্য করে।

সুপারিশ না করা:

msg := "unexpected values %v, %v\n"
fmt.Printf(msg, 1, 2)

সুপারিশ করা:

const msg = "unexpected values %v, %v\n"
fmt.Printf(msg, 1, 2)

প্রিন্টএফ-স্টাইল ফাংশন নেমিং

প্রিন্টএফ-স্টাইল ফাংশন ঘোষণা করার সময়, নিশ্চিত করুন যে go vet ফরম্যাট স্ট্রিং পরীক্ষা এবং যাচাই করতে পারে।

এটা মানে কোরার যে আপনাকে যত সম্ভব পূর্বনির্ধারিত Printf-স্টাইল ফাংশন নামগুলি ব্যবহার করতে হবে। go vet এগুলি পূর্বে থেকে চেক করবে। বিস্তারিত তথ্যের জন্য, Printf Family দেখুন

যদি পূর্বনির্ধারিত নাম ব্যবহার করা যায় না, তবে নির্বাচিত নামের শেষে f দিয়ে শেষ করুন: Wrapf ব্যবহার করুন Wrap এর পরিবর্তে। go vet বিশেষিত প্রিন্টএফ স্টাইল নামগুলি পরীক্ষা করতে বলতে পারে, তবে নামটির শেষে f দিতে হবে।

go vet -printfuncs = wrapf, statusf