В Go переменные могут содержать либо типы значений, либо ссылочные типы. Понимание разницы между этими двумя типами важно для управления памятью и понимания того, как передаются переменные в Go.
- Типы значений.
Типы значений в 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
}
- Типы ссылок.
Типы ссылок в 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
}