Sobes.tech
Back to questions
Senior
4

Чем отличается функция от метода в Go? В чём техническая разница с точки зрения работы с памятью?

Companies where asked
техвил

Answer from AI

sobes.tech AI

В Go функция — это независимый блок кода, который вызывается по имени и может принимать параметры и возвращать значения. Метод — это функция, связанная с конкретным типом (receiver), которая вызывается через экземпляр этого типа.

Технически метод — это функция с дополнительным неявным параметром — receiver, который может быть значением или указателем. Это влияет на работу с памятью:

  • Если receiver — значение, метод получает копию объекта, изменения внутри метода не влияют на оригинал.
  • Если receiver — указатель, метод работает с оригинальным объектом, изменения отражаются на нём.

Пример:

package main
import "fmt"

type Counter struct {
    count int
}

// Метод с receiver по значению
func (c Counter) IncrementValue() {
    c.count++
}

// Метод с receiver по указателю
func (c *Counter) IncrementPointer() {
    c.count++
}

func main() {
    c := Counter{count: 0}
    c.IncrementValue()
    fmt.Println(c.count) // 0, т.к. копия
    c.IncrementPointer()
    fmt.Println(c.count) // 1, т.к. изменён оригинал
}

Таким образом, метод — это функция с дополнительным параметром receiver, что влияет на передачу данных и управление памятью.