golang 指针不同
更新时间:2023-10-28什么是指针?
指针是一个值,它指向一个内存地址,这个内存地址存放着值的实际内容。通过指针,程序员可以直接访问或修改内存地址的内容,这使得指针在编译高效的代码和操作系统编程方面扮演了重要角色。在Go语言中,指针默认是不可见的。
//go语言指针的声明
var ptr *type
指针与值类型的区别
值类型(int、bool等基本类型、数组、结构体等)表示的是实际的内容。当对值类型进行传递、赋值等操作时,都是将这个实际的内容拷贝一份传递给它。这样可以确保对这个值的操作不对实际内容产生影响。
而指针类型并不是实际内容本身,它是一个对内存地址的引用。运行时,指针变量内部存储的是所指向值的地址。通过指针我们可以访问或修改这个值,即所指向的内存地址中的实际内容。
//指针和值类型的区别
package main
import "fmt"
func main() {
var i int = 100
var p *int
p = &i //对指针赋值
i = *p //对指针取值
fmt.Printf("i 的值为:%d\n", i)
fmt.Printf("指针 p 指向的值为:%d\n", *p)
}
指针的操作
Go语言中的指针操作和C语言十分相似。需要注意的是,在Go语言中,指针变量的默认值是nil,即一个未指向任何地址的指针。
Go语言中的“&”运算符用于获取一个值的内存地址,而“*”运算符可以用于指针取值或指针变量定义。使用“new()”函数可以根据所需类型为指针分配内存空间,而“make()”函数则是为slice、map、channel分配内存空间。
//指针操作示例
package main
import "fmt"
func main() {
var ptr *string
var str string = "hello world"
ptr = &str
fmt.Printf("ptr 的地址为:%x\n", ptr)
fmt.Printf("ptr 指向的值为:%s\n", *ptr)
var value *int = new(int) //根据所需类型分配内存空间,并返回类型指针
*value = 10
fmt.Printf("value 的值为:%d\n", *value)
slice := make([]int, 5) //为slice分配内存空间
fmt.Println("初始化后的切片为:", slice)
}
指针的用途
指针在Go语言中多数时候用于性能优化,或者在需要修改函数参数时传递函数参数。另外,Go语言中的gc垃圾回收器会对无引用的内存空间进行回收,因而如果程序中使用了大量内存,会造成频繁回收gc影响性能的情况。使用指针可以解决这个问题。
另外,指针还可以用于实现数据结构,比如链表等。Go语言的slice类型就是通过指针实现的,它既可以被看做指向数组的指针,也可以看做动态数组来使用。
//指针的用途示例
package main
import "fmt"
func swap(x *int, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
func main() {
var a int = 100
var b int = 200
fmt.Printf("交换前的值为:a = %d, b = %d\n", a, b)
swap(&a, &b)
fmt.Printf("交换后的值为:a = %d, b = %d\n", a, b)
slice := []int{1, 2, 3}
var slicePtr *[]int = &slice
fmt.Printf("slice第一个元素:%d\n", (*slicePtr)[0])
}