当前位置:  首页>> 技术小册>> GO面试指南

在 Go 中,引用类型和指针都可以用来间接访问和修改数据,但它们有一些不同之处:

引用类型是指那些存储在堆上的复合数据类型(如数组、结构体和 map),它们可以在函数之间传递,也可以作为函数的返回值,而不需要使用指针。

指针是一个指向内存地址的值,可以用来访问和修改该地址处的值,它们通常用于管理堆上的内存和传递参数。
下面是一个示例代码,演示了引用类型和指针的不同之处:

  1. package main
  2. import "fmt"
  3. // 定义一个结构体类型
  4. type Person struct {
  5. Name string
  6. Age int
  7. }
  8. // 函数返回一个指向结构体的指针
  9. func NewPersonPointer(name string, age int) *Person {
  10. p := Person{Name: name, Age: age}
  11. return &p
  12. }
  13. // 函数返回一个结构体类型的值
  14. func NewPersonValue(name string, age int) Person {
  15. return Person{Name: name, Age: age}
  16. }
  17. func main() {
  18. // 创建一个指向结构体的指针
  19. p1 := NewPersonPointer("Alice", 20)
  20. // 修改指针指向的结构体的值
  21. p1.Age = 21
  22. fmt.Println(*p1) // {Alice 21}
  23. // 创建一个结构体类型的值
  24. p2 := NewPersonValue("Bob", 30)
  25. // 尝试修改结构体的值,会得到编译错误:
  26. // cannot assign to p2.Age (struct field value)
  27. // p2.Age = 31
  28. fmt.Println(p2) // {Bob 30}
  29. }

在上面的示例中,Person 是一个结构体类型,NewPersonPointer 函数返回一个指向 Person 的指针,NewPersonValue 函数返回一个 Person 类型的值。

在 main 函数中,我们创建了一个指向结构体的指针 p1,通过修改指针指向的结构体的值来更新数据;同时,我们也创建了一个结构体类型的值 p2,由于该值是一个实际的值而不是指向堆上的数据的指针,所以我们无法通过修改其值来更新数据,否则会得到编译错误。


该分类下的相关小册推荐: