Sobes.tech
Junior

Ką reiškia žvaigždutės buvimas prie imtuvo Go?

sobes.tech AI

Atsakymas iš AI

Go kalboje žvaigždutė (*) prie priimančiojo reiškia, kad metodas kviečiamas nuorodos į egzempliorių tipą, o ne pačios reikšmės.

Pagrindinės pasekmės:

  1. Būsenos keitimas: Metodas su nuorodos priimančiuoju gali keisti struktūros (ar kito tipo) laukus, į kuriuos nurodo nuoroda. Be žvaigždutės, metodas dirba su kopija ir pakeitimai viduje neatsispindi originalui.
  2. Veiksmingumas: Nuorodos perdavimas gali būti efektyvesnis nei didelės struktūros perdavimas kaip reikšmė, nes perduodama tik atminties adresas, o ne visa struktūra.
  3. Nil reikšmės: Metodai su nuorodos priimančiuoju gali būti kviečiami su nil nuorodomis, kas gali būti naudinga tvarkant tokias situacijas.

Pavyzdys:

package main

import "fmt"

type Counter struct {
	value int
}

// Metodas su reikšmės priimančiuoju: nekeičia originalaus Counter
func (c Counter) IncrementByValue() {
	c.value++ // keičiasi tik kopija
}

// Metodas su nuorodos priimančiuoju: keičia originalų Counter
func (c *Counter) IncrementByPointer() {
	c.value++ // keičiasi originali reikšmė
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Reikšmė po IncrementByValue:", c1.value) // išves 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Reikšmė po IncrementByPointer:", c2.value) // išves 1
}