GO基础-参数传递与指针
大约 4 分钟
参数传递类型与指针
值传递与引用传递
传递类型 | 描述 |
---|---|
值传递 | 值传递是指在调用函数时将是啊及参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到时间参数。 |
引用传递 | 引用传递是值在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 |
- 值传递,是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数;值传递的数据类型包括:基本数据类型
int
系列,float
系列,bool
,string
,数组和结构体struct
等。 - 引用传递,是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数;引用类型数据类型包括: 指针,
slice
切片,map
,管道chan
,interface
等。
指针
指针的定义
Go语言中的指针与其他语言类似,用于存储变量的内存地址。指针变量可以指向任何数据类型,包括自定义类型。在Go中,声明指针使用*
操作符,而通过&
操作符可以获取变量的地址。
package main
import "fmt"
func main() {
// 定义一个整数变量
var num int = 1
// 声明一个指向整数的指针
var ptr *int
// 获取变量的地址,并将地址赋值给指针变量
ptr = &num
// 打印变量的值和地址
fmt.Println("Value of num:", num) // Value of num: 1
fmt.Println("Address of num:", &num) // Address of num: 0xc00000a0f8
// 打印指针变量的值和指向的变量的值
fmt.Println("Value of ptr:", ptr) // Value of ptr: 0xc00000a0f8
fmt.Println("Value pointed by ptr:", *ptr) // Value pointed by ptr: 1
// 修改指向的变量的值
*ptr = 99
// 打印修改后的变量的值
fmt.Println("Modified value of num:", num) // Modified value of num: 99
}
指针初始化
在Go语言中,指针变量的初始化通常是通过new
关键字或直接使用地址运算符&
来完成的。
- 使用
new
初始化
package main
import "fmt"
func main() {
// 使用 new 关键字初始化指针
ptr := new(int)
// 打印指针变量的值(指向的地址)
fmt.Println("Value of ptr:", ptr) // Value of ptr: 0xc00007c020
// 修改指向的变量的值
*ptr = 42
// 打印修改后的变量的值
fmt.Println("Modified value:", *ptr) // Modified value: 42
}
- 使用
&
初始化
package main
import "fmt"
func main() {
// 定义一个整数变量
num := 10
// 使用地址运算符 & 初始化指针
ptr := &num
// 打印指针变量的值(指向的地址)
fmt.Println("Value of ptr:", ptr) // Value of ptr: 0xc000016060
// 打印指向的变量的值
fmt.Println("Value pointed by ptr:", *ptr) // Value pointed by ptr: 10
// 修改指向的变量的值
*ptr = 20
// 打印修改后的变量的值
fmt.Println("Modified value of num:", num) // Modified value of num: 20
}
指针的原理
在 Go 语言中,指针是一种特殊的变量类型,用来存储另一个变量的内存地址。指针变量可以指向任何数据类型(如整数、字符串、结构体、函数等),并允许直接访问其所指向的变量的值或修改它。
存储内存地址:指针变量存储另一个变量的内存地址。这个内存地址指向存储实际值的位置。
操作符
&
:在 Go 中,通过使用操作符&
可以获取一个变量的地址,生成一个指向该变量的指针。操作符
*
:指针的间接引用操作符*
,可以用于访问指针所指向的变量的值。通过*ptr
访问指针ptr
所指向的变量。空指针(nil):指针变量的零值是
nil
,表示它不指向任何有效的内存地址
package main
import "fmt"
func main() {
var num int = 42 // 声明一个整数变量 num,并赋值为 42
var ptr *int // 声明一个整数指针变量 ptr
ptr = &num // 将 num 的地址赋值给指针 ptr
fmt.Println("Value of num:", num) // Value of num: 42
fmt.Println("Address of num:", &num) // Address of num: 0xc0000140a8
fmt.Println("Value of ptr:", ptr) // Value of ptr: 0xc0000140a8
fmt.Println("Value pointed by ptr:", *ptr) // Value pointed by ptr: 42
*ptr = 100 // 通过指针修改 num 的值
fmt.Println("\nValue of num after modification:", num) // Value of num after modification: 100
}