0

0

一篇文章带你了解Go语言基础之指针

Go语言进阶学习

Go语言进阶学习

发布时间:2023-07-24 17:27:01

|

1110人浏览过

|

来源于Go语言进阶学习

转载

引言

因为Go语言是类C语言,所以为了提高效率,仍然保留了指针。

但是如果没有接触过指针,可能学起来指针需要多多思考一下了。

指针通常情况下,也被称为小白劝退神奇。


基本类型指针的理解

先看这两行代码。

var n1 int = 666
fmt.Println(n1)//结果:666
fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值

内存分布图如下。

一篇文章带你了解Go语言基础之指针

再看看这样两行代码,这里用到了&

var n1 int = 1
//表示取n1的地址
fmt.Println(&n1)//结果:0xc00000a0b8
fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8

如图所示。

一篇文章带你了解Go语言基础之指针

如果这两个能理解,恭喜你,指针已经会了一半了。


引用类型指针的理解

先看这样的代码。

var studentList = []string{"张三", "李四"}//一个切片
fmt.Println(studentList)        //结果:[张三 李四]
fmt.Printf("%p\n", studentList) //结果:0xc0000044a0
//去地址
fmt.Printf("%p\n", &studentList) //结果:0xc0000044a0

内存分布图如下。

一篇文章带你了解Go语言基础之指针


值类型和引用类型

值类型

在Go中,值类型主要有。

intfloatboolstring数组struct(结构体)

内存分布大致如下。

一篇文章带你了解Go语言基础之指针

注:字符串数组结构体这些属于连续存储变量指向的是它们的第一个地址,剩下的会根据长度计算。

引用类型

在Go中,引用类型主要有。

切片(slice)map管道(chan)

内存分布大致如下。

一篇文章带你了解Go语言基础之指针


栈内存和堆内存的区别

栈内存在存储上,只能存一些简单的东西,比如数字了字符了浮点数了之类的,但是栈内存分配的内存程序员不用回收,由系统自己回收,并且性能很高。

堆内存在存储上就比较丰富了,随便存,像map,随便塞,但是堆内存分配的内存需要程序员自己回收,典型例子,C++,如果语言由GCGC回收,性能稍弱那么一点点点....,但是人家能随便存啊,多随便。


&*的意思

&叫做取地址符。

*叫做收地址符吧。

示例

var c *int//*int是一个整体,说明c这个变量只能接收int类型的

*int是一个整体,表示c这个变量只能接收int类型地址

代码

package main


import "fmt"


func main() {
    var c *int
    var d int = 1
    //c = d//错误需要的是d的地址
    c = &d
    fmt.Println(c)
}

执行结果。

一篇文章带你了解Go语言基础之指针

可以看到打印的也是一个地址,但是内存图还是基本类型图。

一篇文章带你了解Go语言基础之指针

如果要打印c的值,直接*c就好了,取得就是地址里面对应得值了。

fmt.Println(*c)

关于函数

我们一直在强调,操作只会操作上面的,函数同理。

package main


import "fmt"


func say1(x int) {
    //x int 相当于隐藏了一行代码
    //隐藏的代码时 var x int = x,一定要记住这个
    fmt.Printf("say1:%p\n", x)
}
func say2(x *int) {
    //隐藏的代码是 var x *int = x,x是一个地址
    fmt.Printf("say2:%p\n", x)
}
func say3(x []int) {
    //隐藏的代码是 var x []int = x,因为x是引用类型,所以x是一个地址
    fmt.Printf("say3:%p\n", x)
}
func main() {
    say1(1)//栈上面是1,所以传进去就是1
    var x1 = 1
    say2(&x1)//say只能接收整数地址
    var x2 = []int{1, 1}
    say3(x2)//x2是引用类型,所以传进去的时候就是地址,栈上面的就是地址
}

执行结果。

一篇文章带你了解Go语言基础之指针


总结

上述我们主要讲述了基本类型指针引用类型指针,也叫做值类型引用类型,并且画出了值类型引用类型内存的本质区分图,后来又讲了&*的区别,还有函数传参的本质是什么,希望对大家的学习有帮助。

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.7万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

Go 教程
Go 教程

共32课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号