Go 必知必会:深入探索 Go 语言中的指针,内存操作的艺术
文末有面经共享群
本文来自极客学院专栏,欢迎订阅:Go入门进阶实战专栏:其实学Go很简单。
首先,尽管指针(pointer)和 switch 语句在概念上并无直接联系,但本文将它们并置讨论的原因在于:这两个编程概念在实际学习和应用过程中常被编程人员所忽视。
对于指针的使用,初学者往往因其概念的抽象性和操作的复杂性而产生畏惧,倾向于避免使用或在并发编程中错误地应用,这可能导致严重的数据竞争和同步问题,影响程序的稳定性和安全性。
另一方面,许多开发者在面对条件分支时,习惯性地依赖 if-else 语句,而未能充分利用 switch 语句在处理多条件逻辑时的高效性和清晰性,从而错失了优化代码结构和提升程序性能的机会。
指针 pointer
在 Go 语言中,指针是编程中一个核心的概念,它允许程序直接操作内存地址。虽然 Go 语言对指针的操作相对简单,主要通过两个符号来实现:
&
操作符用于获取变量的内存地址。当你想要获取一个变量的引用,而不是它的值时,可以使用&
来取地址。*
操作符用于间接引用,也就是通过一个指针来访问和修改它所指向的内存地址上存储的值。
应用
在许多编程语言中,变量是对内存中存储的值的一个命名引用。然而,有时我们可能需要直接操作内存地址,这就需要用到指针。Go 语言提供了两种基本的指针操作符号:&
用于获取变量的内存地址,而*
用于间接引用,即通过指针来访问或修改内存地址上存储的值。
现在,让我们通过一个具体的例子来演示这些操作:
打印结果如下:
查询内存地址的类型
当我们获取一个变量的地址时,实际上是创建了一个指针类型的变量,这个指针变量的类型是由它所指向的变量的类型决定的。例如,如果一个指针指向一个int
类型的变量,那么这个指针的类型就是*int
,即指向int
的指针。
现在,让我们通过代码示例来演示如何查询内存地址的类型,并根据这个地址来获取和打印原始变量的值:
打印结果如下:
我们发现打印的结果是:*int
,即 int 类型的指针。
nil pointer
nil
是一个特殊的值,表示指针没有指向任何内存地址。这与 C 或 C++中的空指针概念类似,但 Go 语言的nil
指针更加安全,因为它们不允许进行解引用操作,从而避免了潜在的程序崩溃。当一个指针变量被声明后未初始化,它就是一个nil
指针。了解如何声明和识别nil
指针,以及如何安全地使用它们,是每个 Go 程序员的必备技能。
现在,让我们通过代码示例来演示nil
指针的使用和转换:
打印结果如下:
总结如下:
对变量进行取地址操作(
&
),可以获得这个变量的指针变量;指针变量的值是指针地址(内存地址);
对指针变量进行取值操作(
*
),可以获得这个指针变量指向原变量的值,即通过内存地址取值。
switch
我们往往习惯于使用 if 判断,switch 可以简化 if 判断。
switch 的作用和 if 是一样的,都是进行条件判断,引入 switch 的原因是能简化我们的 if 判断,让代码的可读性更强。
可读性更好
举个例子:if 判断来判断手指的名称。
switch 判断手指名称:
对比之下立竿剪影:switch case 这种方式可读性更好。
case 后支持多个参数
举个例子:奇偶数判断。
case 后加判断
举个例子:
注意:当在 case 后加判断时,switch 后面不需要传入参数,否则会报错:类型不匹配。
fallthrough
在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用 fallthrough;在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。
总结
相信你阅读完这篇文章对 Go 语言中的指针有了更深刻的理解。至于 switch,只要我们心里有这个概念即可:switch 作用和 if 一样,当我们意识到需要写多个 if 判断时,改用 switch 实现,往往会是比较好的实践。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:【infoQ】。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/7cdde9c57690cce6445dac6bd】。文章转载请联系作者。
评论