முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 5 · பாடம் 2 இன் 5பாடத்திட்டத்தில் 22/50~14 min
தொகுதி பாடங்கள் (2/5)

முறைகள்: மதிப்பு vs சுட்டிக்காட்டி பெறுதல்

Go இல் ஒரு முறை என்பது ரிசீவர்: ஒரு சிறப்பு func மற்றும் முறையின் பெயருக்கு இடையே அறிவிக்கப்பட்ட அளவுரு, இது பிணைக்கப்பட்டுள்ளது ஒரு வகைக்கான முறை. வகுப்புகள் எதுவும் இல்லை: முறைகளை வரையறுக்கலாம் தற்போதைய தொகுப்பில் அறிவிக்கப்பட்ட எந்த வகை வகையும்.

தொடரியல்

Go
type Person struct {
    Name string
}

func (p Person) Greet() string {
    return "ciao " + p.Name
}

p := Person{Name: "Ada"}
fmt.Println(p.Greet())   // "ciao Ada"

p Person பெறுபவர் Greet ஐ Person இன் முறையாக மாற்றுகிறது. உள்ளே முறை, p என்பது மற்றதைப் போன்ற ஒரு மாறி.

மதிப்பு பெறுதல் மற்றும் சுட்டிக்காட்டி பெறுதல்

Go
// VALUE receiver: operates on a COPY of the value
func (p Person) NameUpper() string {
    return strings.ToUpper(p.Name)
}

// POINTER receiver: operates on the original value, can mutate it
func (p *Person) Rename(n string) {
    p.Name = n
}

ஒரு பாயிண்டர் ரிசீவர் மூலம் நீங்கள் ரிசீவரை மற்றும் மாற்றங்களை மாற்றலாம் முறைக்கு வெளியே தெரியும். மதிப்பு பெறுநரால் உங்களால் முடியாது - நீங்கள் விரும்புவீர்கள் உள்ளூர் நகலை மட்டும் மாற்றவும்.

Go
p := Person{Name: "Ada"}
p.Rename("Grace")
fmt.Println(p.Name)   // "Grace" — change is visible

ஒரு சுட்டி ரிசீவரை எப்போது பயன்படுத்த வேண்டும்

நடைமுறை விதிகள், முன்னுரிமை வரிசையில்:

  1. நீங்கள் பெறுநரை மாற்ற வேண்டும் → சுட்டி பெறுநரை. கட்டாயம்.
  2. ஸ்ட்ரக்ட் பெரியது (டஜன் கணக்கான புலங்கள், வரிசைகள் உள்ளே) → சுட்டிக்காட்டி விலையுயர்ந்த பிரதிகளைத் தவிர்க்க ரிசீவர்.
  3. நிலைத்தன்மை: வகையின் குறைந்தபட்சம் ஒரு முறை சுட்டி ரிசீவர் இருந்தால், பயன்படுத்தவும் மற்றவர்களுக்கும் ஒரு சுட்டி ரிசீவர். மிக முக்கியமான மாநாடு இடைமுகங்கள் (தொகுதி 6).
  4. சிறிய, மாறாத, "மதிப்பு" வகைகள் (நேரம். நேரம், சிக்கலான எண்கள், சிறியது கட்டமைப்புகள்) → மதிப்பு பெறுதல், மேலும் படிக்கக்கூடியது.

கட்டமைக்கப்படாத வகைகளின் முறைகள்

உங்கள் தொகுப்பில் அறிவிக்கப்பட்ட எந்த NAMED வகையிலும் முறைகளை நீங்கள் வரையறுக்கலாம்:

Go
type Celsius float64

func (c Celsius) ToFahrenheit() float64 {
    return float64(c)*9/5 + 32
}

t := Celsius(20)
fmt.Println(t.ToFahrenheit())  // 68

பிற தொகுப்புகளின் வகைகளில் அவற்றை நீங்கள் வரையறுக்க முடியாது (எ.கா. int, string): நீங்கள் கண்டிப்பாக முதலில் உள்ளூர் பெயரிடப்பட்ட வகையை உருவாக்கவும்.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m5.l2.e1
முயற்சிகள்: 0ஏற்றுகிறது…

'ciao <Name>' என்பதை வழங்கும் நபருக்கு வாழ்த்து() ஸ்ட்ரிங் முறையை (மதிப்பு பெறுபவர்) சேர்க்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

முறை பெயருக்கு முன் அடைப்புக்குறிக்குள் பெறுபவர்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m5.l2.e2
முயற்சிகள்: 0ஏற்றுகிறது…

p.Name ஐ மாற்றும் POINTER ரிசீவருடன் Rename(n string) முறையைச் சேர்க்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

பாயிண்டர் ரிசீவர்: `(ப *நபர்)`.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m5.l2.e3
தயார்

சுட்டி ரிசீவரை (p *T) எப்போது பயன்படுத்த வேண்டும்?

Go
func (t ?T) M() { ... }
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • முறை = ரிசீவருடன் கூடிய செயல்பாடு: func (r T) Name(...) ... { ... }.
  • மதிப்பு பெறுபவர்: ஒரு நகலில் செயல்படுகிறது; பாயிண்டர் ரிசீவர்: அசலில் இயங்குகிறது.
  • அழைப்பு தளத்தில் தானாகவே T ↔ *T மாற்றத்தை Go செய்கிறது.
  • பாயிண்டர் ரிசீவர் எப்போது: பிறழ்வு + பெரிய கட்டமைப்பு + வகையின் பிற முறைகளுடன் நிலைத்தன்மை.
  • மதிப்பு மற்றும் சுட்டிக்காட்டி பெறுதல்களை ஒரே வகைகளில் ஒருபோதும் கலக்க வேண்டாம்.
  • தற்போதைய தொகுப்பில் உள்ள NAMED வகைகளில் முறைகள் செல்கின்றன (கட்டுமானம் அல்லாதவை உட்பட).