Понимание типов значений и ссылочных типов в Go: объяснение на примерах

В Go переменные могут содержать либо типы значений, либо ссылочные типы. Понимание разницы между этими двумя типами важно для управления памятью и понимания того, как передаются переменные в Go.

  1. Типы значений.
    Типы значений в Go включают в себя базовые типы, такие как целые числа, числа с плавающей запятой, логические значения и символы, а также структуры и массивы. Когда тип значения присваивается переменной или передается в качестве аргумента функции, создается копия значения.

Пример:

package main
import "fmt"
func main() {
    x := 10
    y := x
    fmt.Println(x) // Output: 10
    fmt.Println(y) // Output: 10
    y = 20
    fmt.Println(x) // Output: 10 (original value is unaffected)
    fmt.Println(y) // Output: 20
}
  1. Типы ссылок.
    Типы ссылок в Go включают фрагменты, карты, каналы и указатели. Когда ссылочный тип присваивается переменной или передается в качестве аргумента функции, передается ссылка на базовую структуру данных, а не копия всей структуры данных.

Пример:

package main
import "fmt"
func main() {
    x := []int{1, 2, 3}
    y := x
    fmt.Println(x) // Output: [1 2 3]
    fmt.Println(y) // Output: [1 2 3]
    y[0] = 10
    fmt.Println(x) // Output: [10 2 3] (original value is modified)
    fmt.Println(y) // Output: [10 2 3]
}

Методы для типов значений и ссылочных типов.
Методы, доступные для типов значений и ссылочных типов, в Go одинаковы. Вы можете определить методы как для значений, так и для ссылочных типов, используя ключевое слово funcи тип получателя.

Пример:

package main
import "fmt"
type Point struct {
    X, Y int
}
func (p Point) Distance() float64 {
    return math.Sqrt(float64(p.X*p.X + p.Y*p.Y))
}
func main() {
    p := Point{3, 4}
    fmt.Println(p.Distance()) // Output: 5
}