Go语言的指针(深度解析)
Go语言中的指针是一个存储变量内存地址的变量。使用指针,可以直接访问和修改变量的值。
- 声明指针:
var varName *varType
例如:
var ip *int
- 使用
&
运算符获取变量的内存地址:
var ip *int
a := 10
ip = &a
- 使用
*
运算符获取指针指向的值:
fmt.Println(*ip) // 输出:10
- 修改指针指向的值:
*ip = 20
fmt.Println(a) // 输出:20
- 指针作为函数参数:
func change(val *int) {
*val = 30
}
change(ip)
fmt.Println(a) // 输出:30
- 空指针和nil值:
空指针是指针变量的默认值,表示不指向任何对象。
var test *int
if test == nil {
fmt.Println("test is nil") // 输出:test is nil
}
- 指针与结构体:
type Person struct {
name string
age int
}
func main() {
person := Person{"John", 30}
p := &person
fmt.Println(p.name) // 输出:John
fmt.Println((*p).name) // 输出:John
p.age = 31
fmt.Println(person.age) // 输出:31
}
- 数组指针:
arr := [5]int{1, 2, 3, 4, 5}
arrPtr := &arr
for i := 0; i < 5; i++ {
fmt.Printf("Address of arr[%d] = %p\n", i, &arr[i])
}
- 切片指针:
s := []int{1, 2, 3, 4, 5}
sPtr := &s
for i := 0; i < len(s); i++ {
fmt.Printf("Address of s[%d] = %p\n", i, &s[i])
}
- 方法接收者为指针:
type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I am %s\n", p.name)
}
func (p *Person) change(name string, age int) {
p.name = name
p.age = age
}
func main() {
person := Person{"John", 30}
person.say() // 输出:I am John
person.change("Doe", 31)
person.say() // 输出:I am Doe
}
以上是Go语言指针的基本使用方法和示例。
评论已关闭