【gogogo专栏】指针

go语言指针

为什么需要指针

作为一个大学划水,毕业一直写java的程序员来说,多多少少对于指针有点陌生,由于近期需要转go,正好学到指针这里,就来探究下指针的使用场景和用法吧。

首先我们来看下以下这个简单的例子,主方法通过形参将a传递进方法changeValue,然后这个方法将值改变了,那么主方法得到的值是否会改变呢?

go 复制代码
import "fmt"

/**
指针专题
*/

func changeValue(p int) {
	p = 10
}

func main() {
	var a = 1
	changeValue(a)
	fmt.Println("a = ", a)
}

运行后我们发现打印的a的值为1,a并没有因为changeValue这个方法而改变。

究其原因是因为我们调用方法的时候是通过值传递的,而非地址传递,它的模型如下:

因为两个值存在于不同的地址中,所以值没有改变,为了使上述方法能让值得到修改,我们需要通过指针传入地址来让修改的变量值在当前地址中进行修改。

go 复制代码
package main

import "fmt"

/**
指针专题
*/

func changeValue(p *int) {
	*p = 10
}

func main() {
	var a = 1
	changeValue(&a)
	fmt.Println("a = ", a)
}

因此使用指针过后,修改的为地址的值

指针使用实例

值传递

go 复制代码
func swap(a int, b int) {
	var temp int
	temp = a
	a = b
	b = temp
}

func main() {
	var a = 10
	var b = 20
	swap(a, b)
	fmt.Println("a=", a, "b=", b)
}

最终a=10 b=20,值并没有改变

地址传递

go 复制代码
func swap(pa *int, pb *int) {
	var temp int
	temp = *pa
	*pa = *pb
	*pb = temp
}

func main() {
	var a = 10
	var b = 20
	swap(&a, &b)
	fmt.Println("a=", a, "b=", b)
}

最终a=20 b=10,通过地址传递改变了原来的值

多级指针

指向指针的指针称为多级指针

go 复制代码
func main() {
	a := 0
	//一级指针
	var p *int
	p = &a
	fmt.Println(&a)
	fmt.Println(p)
	//二级指针
	var pp **int
	pp = &p
	fmt.Println(&p)
	fmt.Println(pp)
}

打印结果如下

0x1400000e078
0x1400000e078
0x14000046020
0x14000046020
相关推荐
__AtYou__13 分钟前
Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题
leetcode·golang·题解
拉玛干20 分钟前
社团周报系统可行性研究-web后端框架对比-springboot,django,gin
数据库·python·spring·golang
gopher95112 小时前
go语言 数组和切片
开发语言·golang
gopher95112 小时前
go语言Map详解
开发语言·golang
Python私教2 小时前
Go语言现代web开发15 Mutex 互斥锁
开发语言·前端·golang
java知路7 小时前
go 以太坊代币查余额
golang
gopher95117 小时前
go语言基础入门(一)
开发语言·golang
大得36910 小时前
go注册中心Eureka,注册到线上和线下,都可以访问
开发语言·eureka·golang
王中阳Go15 小时前
字节跳动的微服务独家面经
微服务·面试·golang
qq_1728055919 小时前
GO GIN 推荐的库
开发语言·golang·gin