在 Go 语言中,* 符号与指针相关。它的使用场景主要包括以下几种情况:
1. 指针的声明
当你在 Go 中声明一个指针时,需要使用 * 来表示该变量是一个指针。指针保存的是变量的内存地址,而不是变量的值。
var p *int这表示 p 是一个指向 int 类型的指针,它可以保存一个 int 类型变量的内存地址。
2. 取指针指向的值(解引用)
当你有一个指针并且想访问指针所指向的值时,需要使用 * 来进行解引用。
var x int = 10
var p *int = &x // p 保存了 x 的内存地址
fmt.Println(*p) // 输出 10,表示获取了 p 所指向的 x 的值通过 *p,你可以访问 p 所指向的变量的实际值。
3. 与结构体结合使用
在结构体中,使用指针可以避免复制结构体,特别是在传递大型结构体时。你可以用 * 来指向结构体实例。
type Person struct {
    name string
    age  int
}
func changeName(p *Person, newName string) {
    p.name = newName
}
p := Person{name: "Alice", age: 25}
changeName(&p, "Bob") // 传递结构体的指针
fmt.Println(p.name) // 输出 Bob在这个例子中,changeName 函数接受一个 Person 结构体的指针 *Person,然后修改其字段值。
4. 方法接收者中的指针
在 Go 中,可以为一个结构体定义方法接收者,而使用指针接收者 *Type 可以修改接收者的值。
type Counter struct {
    count int
}
func (c *Counter) Increment() {
    c.count++
}
counter := Counter{count: 0}
counter.Increment()
fmt.Println(counter.count) // 输出 1如果这里不使用指针接收者(即 func (c Counter) Increment()),则修改 count 的操作只会作用在接收者的副本上,而不会影响原始的 counter 实例。
5. 指针与数组/切片
指针可以指向数组的第一个元素,进行数组的操作时也可以用指针。
arr := [3]int{1, 2, 3}
p := &arr[0]
fmt.Println(*p) // 输出 16. nil 指针
Go中的指针可以为空,即指向nil。在操作指针前,通常需要判断指针是否为nil,避免引发运行时错误。
var p *int
if p != nil {
    fmt.Println(*p)
} else {
    fmt.Println("指针为空")
}总结
- *用于声明指针类型。
- *用于解引用指针,访问指针所指向的值。
- 指针在修改结构体、避免内存拷贝和管理资源时非常有用。
