Golang 开发实战day12 - 指针

  在 Golang 中,指针是一种强大的工具,可以让我们直接操作内存中的数据。与其他编程语言相比,Golang 的指针更加轻量级,但也更灵活,这使得它在性能和开发效率之间取得了良好的平衡。

1、指针的基本概念

  指针就像一张指向内存中某个位置的地址的纸条。我们可以通过指针来访问和修改该位置的数据。

1.1 声明指针:

var p *int // 声明一个指向 int 型数据的指针

1.2 获取指针的值:

i := 10
p = &i // 将变量 i 的地址赋给指针 p
fmt.Println(*p) // 输出 10

1.3 修改指针的值:

*p = 20 // 将指针 p 指向的值修改为 20
fmt.Println(i) // 输出 20

2 示例代码

示例一

func updateName(x string) {
	x = "大雄"
}

func main() {
		
	name := "哆啦A梦"

	updateName(name)

	fmt.Println("名字所在的内存地址:", &name)

	m := &name

	fmt.Println(m)

	fmt.Println(name)
}

Output:
Golang 开发实战day12 - Pointer-LMLPHP
底下就是帮助理解的结构,m是引用了name的指针,所以地址也是指向了name的地址。比较简陋,往君见谅。

    |---name---|-----m-----| 
    |  0x001   |   0x002   |
    |----------|-----------|
    | "哆啦A梦" |   p0x001  |
    |----------|-----------|

示例二

type Person struct {
	Name string
	Age  int
}

func main() {
		
	person := Person{Name: "大雄", Age: 10}

	name := &person.Name // 获取指向 Name 字段的指针
	*name = "哆啦A梦"       // 修改 Name 字段的值

	age := &person.Age // 获取指向 Age 字段的指针
	*age = 12         // 修改 Age 字段的值

	fmt.Println(person)
}

Output:
Golang 开发实战day12 - Pointer-LMLPHP

3 指针的优点

  • 高效: 指针可以让我们直接操作内存中的数据,而无需进行额外的复制操作,因此效率更高。
  • 方便: 指针可以方便地传递和共享数据,而无需创建额外的副本。
  • 灵活: 指针可以让我们直接修改内存中的数据,而无需创建新的变量。

4 指针的注意事项

  • 指针不能指向不存在的数据: 确保指针指向的内存地址有效,否则会导致程序崩溃。
    不要同时使用多个指针指向同一块内存: 避免数据竞争,导致程序行为不可预料。
  • 释放不再使用的指针: 使用 defer 语句或其他方式释放不再使用的指针,避免内存泄漏。

5 指针的常见用法

  • 函数参数和返回值: 指针可以作为函数的参数和返回值,提高函数的效率和灵活性。
  • 结构体和数组: 指针可以用于访问和修改结构体和数组中的元素。
  • 内存管理: 指针可以用于手动管理内存,例如分配和释放内存空间。
05-08 02:27